the5fire的技术博客

关注python、vim、linux、web开发和互联网--life is short, we need python.


从Hibernate原理实现知己之肤浅

作者:the5fire | 标签:     | 发布:2011-01-16 10:33 p.m. | 阅读量: 5206, 5194
看马士兵的hibernate教程,把Hibernate的原理通过java实现了一下,实现完成之后突然就想起去年我们用vb.net做机房收费系统的事了,当时把系统做完之后米老师说做的不满意,没有完全面向对象,因为关于数据库的操作不够面向对象。当时我觉得那个系统已经用了我们所有能用到的知识,再加上当时是学校考试期间,自己也没有深究。只是觉得老师要求很高,怎么能通过面向对象完成数据库操作呢?

不过后来学宇在我们上一期师哥的指点下使用类似Hibernate实现的原理实现了封装数据库的操作类,对外完全是面向对象,通过传递对象,内部得到对象名,对象属性,然后完成sql的拼接(使用sql参数拼接),最后组成一个sql语句。

现在突然想起那会儿的事是我觉得人不能固步自封,把自己封闭到自己已有的知识范围内,因为一个人所接触的东西毕竟有限,你的知识圈在大也是有边的。

对比一下以前的自己,发现当时确实是有点傲气。产生傲气的原因有两个:一个是你真的相当牛,在某一行业某一领域是专家;另一个是你真的比较肤浅,以为知道的不少,其实啥也不知道。这就是所谓的不知道自己不知道吧。

现在自己确实谦虚多了,能够感觉的到,因为发现自己不知道的越来越多了。以前觉得时间很充分,现在恨不得天天不睡觉。要时刻提醒自己,人只有不被自己的所学所羁绊才能不断成长。


好了,下面给出Hibernate原理简单实例,不过听老马讲,hibernate的原理并非如此,要真的是这样的话那效率就比较低了,本来操作数据库就不是件高效的事儿。

首先建立数据库,建立student表,id(int),name(varchar(20)), age(int)

然后建立对应的实体类。

建立一个Session类:

package com.hibernate.Mapping;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.HashMap;
import java.util.Map;

import com.hibernate.model.Student;

public class Session {
String tableName = "Student";
Map cfs = new HashMap();
String[] methodNames ;

public Session() {
cfs.put("id", "id");
cfs.put("name", "name");
cfs.put("age", "age");
methodNames = new String[cfs.size()];
}

public void save(Student s) throws Exception {
String sql = createSQL();
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.1.100/hibernate" ,"root", "root");
PreparedStatement ps = conn.prepareStatement(sql);

for (int i = 0; i Method m = s.getClass().getMethod(methodNames[i]);
Class r = m.getReturnType();
if (r.getName().equals("java.lang.String")) {
String returnValue = (String)m.invoke(s);
ps.setString(i+1, returnValue);
}
if (r.getName().equals("int")) {
Integer returnValue = (Integer)m.invoke(s);
ps.setInt(i+1, returnValue);
}
}
ps.executeUpdate();
ps.close();
conn.close();
}

private String createSQL() {
String str1 = "";
String str2 = "";
int index = 0;
for(String s : cfs.keySet()) {
String v = cfs.get(s);
v = Character.toUpperCase(v.charAt(0)) + v.substring(1);
methodNames[index] = "get" + v;
str1 += s + ",";
index++;
}
str1 = str1.substring(0,str1.length() -1 );

for (int i = 0; i < cfs.size(); i++) {
str2 += "?,";
}
str2 = str2.substring(0, str2.length() - 1);

String sql = "insert into " + tableName + "(" + str1 + ")" + " value (" + str2 + ")";
System.out.println(sql);
return sql;
}
}

最后在StudentTest类中调用:

package com.hibernate.client;


import com.hibernate.Mapping.Session;
import com.hibernate.model.Student;

public class StudentTest {
public static void main(String[] args) {
Student s = new Student();
s.setId(2);
s.setName("s2");
s.setAge(22);

Session session = new Session();

try {
session.save(s);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}
}

里面主要用到了反射从类中得到数据库中的相关内容,然后拼接成sql语句。

----EOF-----

扫码关注,或者搜索微信公众号:码农悟凡


其他分类: