自己写hibernate(模拟实现)

来源:互联网 发布:ios编程语言是什么 编辑:程序博客网 时间:2024/06/01 12:44

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

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


下面就是建立工程,并加入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 stubUser 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 blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (Exception e) {// TODO Auto-generated catch blocke.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的实现有了一个大致的了解,但是hibernate的实现比这还复杂,使用的方法也不是这样,但这个模拟的过程,对初学者来说应该是很好的一个学习hibernate实现过程的例子。

原创粉丝点击