SS2.1

    xiaoxiao2021-03-26  43

    Hibernate原理分析 Hibernate实现的两大技术(解析XML文档和反射机制) 模拟Hibernate实现对象保存 Hibernate实现原理 1.Configuration加载hibernate.cfg.xml 2.生成SessionFactory 3.加载对象关系映射文件*.hbm.xml 4.创建session对象 5.调用session API保存对象 6.根据Dialect生成和底层数据库平台相关的sql代码 7.对JDBC封装,执行sql脚本对数据库的操作。 Hibernate实现的关键技术 1.DOM(解析XML文档) public Session() throws Exception { org.dom4j.io.SAXReader reader = new org.dom4j.io.SAXReader();// 生成reader对象 File f = new File("Student.xml"); org.dom4j.Document doc = reader.read(f);// 生成文档对象 org.dom4j.Element root = doc.getRootElement();// 获取根节点 List list1 = root.elements();// 遍历子节点 for (int i = 0; i < list1.size(); i++) { org.dom4j.Element node1 = (org.dom4j.Element) list1.get(i); tableName = node1.attributeValue("table");// 获取节点属性的值 List list2 = node1.elements();// 遍历子节点 for (int j = 0; j < list2.size() ; j++) { org.dom4j.Element node2 = (org.dom4j.Element) list2.get(j); System.out.println(node2.attributeValue("name")); maps.put(node2.attributeValue("name"), node2.attributeValue("column")); } methodNames = new String[maps.size()]; } } 2.反射机制 //生成SQL脚本 private String createSQL() { int index = 0; String s1 = ""; String s2 = ""; for (String key : maps.keySet()) { String value = maps.get(key); s1 += value + ","; methodNames[index++] = "get" + Character.toUpperCase(key.charAt(0)) + key.substring(1); } s1 = s1.substring(0, s1.length()-1); for(int i=0;i<maps.size();i++){ s2+="?,"; } s2 = s2.substring(0, s2.length()-1); String sql = "insert into "+tableName+" ("+s1+") values ("+s2+")"; return sql; } public void save(Student s) throws Exception{ String sql = createSQL(); System.out.println(sql); Connection conn = null; PreparedStatement stmt = null; Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb","root","123456"); stmt = conn.prepareStatement(sql); //反射机制 for(int i=0;i<methodNames.length;i++){ Method m = s.getClass().getMethod(methodNames[i]); Class c = m.getReturnType(); if(c.getName().equals("java.lang.Integer")||c.getName().equals("int")){ int value = (Integer)m.invoke(s); stmt.setInt(i+1, value); } if(c.getName().equals("java.lang.String")){ String value = (String)m.invoke(s); stmt.setString(i+1, value); } } stmt.executeUpdate(); stmt.close(); conn.close(); } 从本质上而言,Hibernate最终还是通过JDBC去操作数据库。只是对JDBC进行了封装。

    模拟Hibernate实现一个对象保存范例

    此项目无法自动创建数据库和表,在开始项目之前执行如下脚本

    CREATE DATABASE IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8; DROP TABLE IF EXISTS `student`; CREATE TABLE `student` (   `sid` INT(11) NOT NULL,   `sname` VARCHAR(255) DEFAULT NULL,   PRIMARY KEY (`sid`) ) ENGINE=INNODB DEFAULT CHARSET=utf8;

    接下来创建的项目结构如下:

    第1步:创建Student.xml对象 - 关系映射文件

    <?xml version="1.0"?> <mapping>   <class name="Student" table="student">     <property name="sid" column="sid"/>     <property name="sname" column="sname"/>   </class> </mapping>

    第2步:创建Student.java实体类

    package net.nw.vo; public class Student { private int sid; private String sname; public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } }

    第3步:模拟hibernate的实现自定义一个Session类

    package net.nw.dao; import java.io.File; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.HashMap; import java.util.List; import java.util.Map; import net.nw.vo.Student; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class Session { // <属性,字段> O-R mapping的映射关系 private Map<String, String> maps = new HashMap<String, String>(); private String tableName; // 表名 private String[] methodNames; // 保存类里面的方法 只保存getXXX()方法 public Session() throws Exception { SAXReader reader = new SAXReader();// 生成reader对象 File f = new File("Student.xml"); Document doc = reader.read(f);// 生成文档对象 Element root = doc.getRootElement();// 获取根节点 List list1 = root.elements();// 遍历子节点 for (int i = 0; i < list1.size(); i++) { Element node1 = (Element) list1.get(i); tableName = node1.attributeValue("table");// 获取节点属性的值 List list2 = node1.elements();// 遍历子节点 for (int j = 0; j < list2.size() ; j++) { Element node2 = (Element) list2.get(j); System.out.println(node2.attributeValue("name")); maps.put(node2.attributeValue("name"), node2.attributeValue("column")); } methodNames = new String[maps.size()]; } }         //生成SQL脚本 private String createSQL() { int index = 0; String s1 = ""; String s2 = ""; for (String key : maps.keySet()) { String value = maps.get(key); s1 += value + ","; methodNames[index++] = "get" + Character.toUpperCase(key.charAt(0)) + key.substring(1); } s1 = s1.substring(0, s1.length()-1); for(int i=0;i<maps.size();i++){ s2+="?,"; } s2 = s2.substring(0, s2.length()-1); String sql = "insert into "+tableName+" ("+s1+") values ("+s2+")"; return sql; } public void save(Student s) throws Exception{ String sql = createSQL(); System.out.println(sql); Connection conn = null; PreparedStatement stmt = null; Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb","root","123456"); stmt = conn.prepareStatement(sql); for(int i=0;i<methodNames.length;i++){ Method m = s.getClass().getMethod(methodNames[i]); Class c = m.getReturnType(); if(c.getName().equals("java.lang.Integer")||c.getName().equals("int")){ int value = (Integer)m.invoke(s); stmt.setInt(i+1, value); } if(c.getName().equals("java.lang.String")){ String value = (String)m.invoke(s); stmt.setString(i+1, value); } } stmt.executeUpdate(); stmt.close(); conn.close(); } }

    第4步:创建测试类Test.java

    package net.nw.test; import net.nw.dao.Session; import net.nw.vo.Student; public class Test { public static void main(String[] args) throws Exception { Session session = new Session(); Student s = new Student(); s.setSid(2); s.setSname("zhaoliu"); session.save(s); } }

    第5步:运行项目,项目效果截图如下:

    本项目源码下载地址

    mysql-connector-java-5.1.40.zip包:http://download.csdn.net/detail/zhengzizhi/9747510 项目源码:http://download.csdn.net/detail/zhengzizhi/9747629

    转载请注明原文地址: https://ju.6miu.com/read-661859.html

    最新回复(0)