刚开始学习hibernate,觉得对数据库的操作变得简单了。所以就对实现进行研究,于是就写了一个模拟hibernate实现的过程。

首先我们开始在数据库中建立一张表,我这里就是建立user表,里面的属性有:id、username、pwd,这三个属性,其中id为主键。设计的表的结构为:

自己写hibernate(模拟实现)_java

下面就是建立工程,并加入mysql的驱动程序。

下面开始代码的编写。首先编写一个User类,里面主要是属性和get、set方法。类的主要代码如下:

package bean; public class User { private int id; private String username; private String pwd; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } }
下面我们就开始写测试的方法,我们知道,在hibernate中使用session 的save(对象)就可以保存数据到数据库中,所以我们也这样的模拟实现一个。我们首先来写测试的方法,再来写方法的实现。(这也叫驱动测试开发)

我们的测试类如下:

package bean; public class hibernateText { public static void main(String[] args) { // TODO Auto-generated method stub User user = new User(); user.setId(1); user.setUsername("王新"); user.setPwd("wangxin"); Session session = new Session(); session.save(user); } }
然后我们再来写Session类的实现,以及save方法的实现。这里面主要用到的是java反射机制,(但是在hibernate的实现中很少用到java反射机制,这里只是模拟。)

下面的代码就是对Session的具体实现:

package bean; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import com.mysql.jdbc.PreparedStatement; public class Session { String tableName = "user"; Map<String ,String > map = new HashMap<String ,String >(); String methodNames[]; public Session () { //定义在数据库中的表名与实体类的对应关系,相当于是hibernate的配置文件 //key对应数据库中的表的属性列。value 就是在实体类中的属性类,使用map将他们与数据库中属性列进行一一对应。 map.put("id", "id"); map.put("username", "username"); map.put("pwd", "pwd"); methodNames = new String[map.size()]; } public void save(User user) { // TODO Auto-generated method stub String sql = createSql(); System.out.println(sql); try { //加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/wuser","root","962464"); PreparedStatement state = (PreparedStatement) con.prepareStatement(sql); for(int i=0;i<methodNames.length;i++) { //得到每一个方法的对象 Method method = user.getClass().getMethod(methodNames[i]); //得到他的返回类型 Class cla = method.getReturnType(); //根据返回类型来设置插入数据库中的每个属性值。 if(cla.getName().equals("java.lang.String")) { String returnValue = (String)method.invoke(user); state.setString(i+1, returnValue); } else if(cla.getName().equals("int")) { Integer returnValue = (Integer) method.invoke(user); state.setInt(i+1, returnValue); } System.out.println(method.getName() + "--" + method.getReturnType()); } state.executeUpdate(); state.close(); con.close(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 得到sql语句 * @return 返回sql语句 */ private String createSql() { // TODO Auto-generated method stub //str1代表数据库中表中的属性列。并将其连接起来。 String str1 = ""; int index=0; for(String key :map.keySet()) { str1 +=key+","; String v = map.get(key); //下面是得到对应的bean中的get方法。也就是得到User类中的getId()、getUsername()、getPwd()方法。 //注意每个属性的get后面的第一个字母是大写,需要转换。 v = "get" + Character.toUpperCase(v.charAt(0)) + v.substring(1); methodNames[index] = v; //将方法保存在数组中。 index++; } str1 = str1.substring(0, str1.length()-1); System.out.println(str1); //得到插入数据的表达式,也就是?,?,? String str2 = ""; for(int i=0;i<map.size();i++) str2 +="?,"; str2 = str2.substring(0,str2.length()-1); System.out.println(str2); String sql = "insert into " + tableName +"(" + str1 + ")" + " values (" + str2 + ")"; return sql; } }
上面的代码其实还可以进行封装,以便于我们下次进行实现别的方法,我们不仅仅能实现save()方法。还可以实现别的方法,这里就不一一的列举。这样我们的代码就完成了,我们开进行测试。

运行我们的测试类。意思就是将id为1,username为“王新”,pwd为“wangxin”存在数据库中。我们执行后看看数据中的内容:

自己写hibernate(模拟实现)_mysql_02


这样我们看到数据库中已经插入数据了,所以我们的模拟实现过程成功了。

总结:通过这个模拟实现的过程 ,我们对hibernate的实现有了一个大致的了解,但是hibernate的实现比这还复杂,使用的方法也不是这样,但这个模拟的过程,对初学者来说应该是很好的一个学习hibernate实现过程的例子。