首页 > Java开发 > Hibernate过程模拟

Hibernate过程模拟

学习了一下Hibernate模拟,我们现在我们不用HIbernate的lib,自己来模拟一下hibernate工作过程,其实就是把java里面save()方法传进来的数据自己拼成SQL语句。再执行sql。

那我们现在开始研究一下,首先我们把之前的项目复制一下,然后命名为Hibernate_0200_OR_Mapping_Simulation,首先来解释下OR Mapping吧,对象数据映射(ORM
ORM-Object/Relational Mapper,即“对象-关系型数据映射组件”。对于O/R,即 Object(对象)和 Relational(关系型数据),表示必须同时使用面向对象和关系型数据进行开发。

我们去掉其中的hibernate lib,去掉Teacher部分。我们现在要写自己的Session。创建Session类在里面建立save()方法。

StudentTest.java

 

[java][/java] view plaincopyprint?

  1. package com.tfj.test;
  2. import com.tfj.hibernate.model.Student;
  3. public class StudentTest {
  4.     public static void main(String args[]) {
  5.         Student s = new Student();
  6.         s.setId(4);
  7.         s.setName("s1");
  8.         s.setAge(1);
  9.         Session session = new Session();
  10.         session.save(s);
  11.     }
  12. }

关于Session部分

 

 

[java][/java] view plaincopyprint?

  1. package com.tfj.test;
  2. import java.lang.reflect.Method;
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.PreparedStatement;
  6. import java.sql.SQLException;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. import com.tfj.hibernate.model.Student;
  10. public class Session {
  11.     String tableName = "student";
  12.     Map<String, String> cfs = new HashMap<String, String>();
  13.     String[] methodNames;
  14.     public Session() {
  15.         cfs.put("_id", "id");
  16.         cfs.put("_name", "name");
  17.         cfs.put("_age", "age");
  18.         methodNames = new String[cfs.size()];
  19.     }
  20.     public void save(Student s) throws Exception {
  21.         String sql = createSQL();
  22.         Class.forName("com.mysql.jdbc.Driver");
  23.         Connection conn = DriverManager.getConnection(
  24.                 "jdbc:mysql://localhost:3306/hibernate", "root", "111111");
  25.         PreparedStatement ps = conn.prepareStatement(sql);
  26.         for (int i = 0; i < methodNames.length; i++) {
  27.             Method m = s.getClass().getMethod(methodNames[i]);
  28.             Class r = m.getReturnType();
  29.             if (r.getName().equals("java.lang.String")) {
  30.                 String returnValue = (String) m.invoke(s);
  31.                 ps.setString(i + 1, returnValue);
  32.             }
  33.             if (r.getName().equals("int")) {
  34.                 Integer returnValue = (Integer) m.invoke(s);
  35.                 ps.setInt(i + 1, returnValue);
  36.             }
  37.             System.out.println(m.getName() + "|" + r.getName());
  38.         }
  39.         ps.executeUpdate();
  40.         ps.close();
  41.         conn.close();
  42.     }
  43.     private String createSQL() {
  44.         String str1 = "";
  45.         String str2 = "";
  46.         int index = 0;
  47.         for (String s : cfs.keySet()) {
  48.             String v = cfs.get(s);
  49.             v = Character.toUpperCase(v.charAt(0)) + v.substring(1);
  50.             methodNames[index] = "get" + v;
  51.             str1 += s + ",";
  52.             index++;
  53.         }
  54.         str1 = str1.substring(0, str1.length() - 1);
  55.         System.out.println(str1);
  56.         for (int i = 0; i < cfs.size(); i++) {
  57.             str2 += "?,";
  58.         }
  59.         str2 = str2.substring(0, str2.length() - 1);
  60.         System.out.println(str2);
  61.         String sql = "insert into " + tableName + "(" + str1 + ")"
  62.                 + " values (" + str2 + ")";
  63.         System.out.println(sql);
  64.         return sql;
  65.     }
  66. }

我们来分析一下代码,在Session里有一个save()方法,那么我们先想到要构建出来sql语句,建立createSQL()方法。需要得到的sql语句是insert into student (_id,_name,_age) values (?,?,?);那么要把表和程序关联起来,想到用一个Map来存储,对应的键和值,键是数据库中表的键名,值是java中student属性名。

 

下来就是得到_id,_name,_student,循环从map里拿到,再截取一下字符串,(得到?,?,?)同理。这样我们的sql就构造好了。

然后是把得到的sql中的?,?,?替换掉,(要用到ps.setXXX(i+1,getXXX()))接下来我们遇到的问题就是,由于有各种数据类型,我们要确定就是数据类型和方法名。这里就用到了反射,通过s(s是一个student)拿到class再拿到方法。通过字符串组合就可以得到各种get方法(如getName(),getAge(),getId()),也是用反射拿到方法返回的数据类型来确定用setXXX()(如setString(i+1,getId()),setInt(i+1,getId()))。

最后就是连接数据库,执行sql语句。来看一下插入成功的截图吧。

 


本文固定链接: http://www.devba.com/index.php/archives/3028.html | 开发吧

报歉!评论已关闭.