模拟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
