hibernate之模拟Hibernate持久化操作
1
2
3
|
Configuration cfg= new Configuration(); cfg.configure(); sessionFactory=cfg.buildSessionFactory(); |
package csg.hibernate.entity; /** * * @author Caesar.hu * @Date 2014-11-28 * @Time 上午09:32:08 * @TODO */ public class Student { private Integer id; private String name; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
package csg.hibernate.entity; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.HashMap; import java.util.Map; /** * * @author Caesar.hu * @Date 2014-11-27 * @Time 下午06:02:05 * @TODO模拟一个Session */ public class Session { // 1、写好一个表名,这个表名,理论上应该在Student.hbm.xml中读出来,或者是注解JPA映射 // 我这里直接写出来,意思就是说,数据存到数据库的表对应的就是这个 String tableName = "_student"; // 2、为什么创建一个String类型的Map? // 这个map存放的就是实体的字段属性和数据库字段匹配,本身也是配置在文件中 Map<String, String> cfs = new HashMap<String, String>(); String[] methodNames;// new一个空集合主要是方便反射使用 public Session() { cfs.put("_id", "id"); cfs.put("_name", "name"); cfs.put("_age", "age"); methodNames = new String[cfs.size()]; } public void save(Student s) throws Exception { // 3、创建SQL语句 String sql = createSQL(); String url = "jdbc:mysql://localhost/hibernate"; String username = "root"; String password = "root"; Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, username, password); PreparedStatement ps = conn.prepareStatement(sql); // 9,sql写好之后,这里是是不是需要设置? // 类似ps.setName(1,s.getId); // ps.setInterge(2,s.getAge) //怎么设置?你怎么知道传进来的是什么类型呢?所以这里最重要的是需要用到反射类型 for (int i = 0; i < methodNames.length; i++) { System.out.println(methodNames[i]);// 首先取到存进到数据中的getAge getInt //10、 通过反射机制根据实体的方法反射出实体一系列的方法getAge,getName,getId和返回类型Integer,String,Integer Method m = s.getClass().getMethod(methodNames[i]); System.out.println(m); System.out.println(s.getClass() + "-------" + m + "---------" + m.getName() + "-----" + m.getReturnType()); //11、获取数组里面getAge,getInt,getName 的返回类型 Class r = m.getReturnType(); //12、根据返回类型判断其应该ps.setString,还是ps.setInteger if (r.getName().equals("java.lang.String")) { //13、invoke是反射里面的一个方法,其作用是通过类的返回值类型反射出属性值 //14、getAge.invoke(s);同样也可以通过值反射出返回类型 String returnValue = (String) m.invoke(s); System.out.println(returnValue); ps.setString(i + 1, returnValue); } //15、同样如果判断是Integer类型,就ps.setInteger if (r.getName().equals("java.lang.Integer")) { System.out.println(m.invoke(s)); Integer returnValue = (Integer) m.invoke(s); // System.out.println(returnValue); ps.setInt(i + 1, returnValue); } } // ps.executeUpdate(); ps.close(); conn.close(); } private String createSQL() { String str1 = ""; int index = 0; for (String s : cfs.keySet()) { // 4、通过Map中的key得到Value String v = cfs.get(s); // 5、根据get,set方法我们可以知道字段首字母是需要大写的, // 6、这段代码就是将取出来的value首字母大写加上get v = Character.toUpperCase(v.charAt(0)) + v.substring(1); // 7、这样new出来的空集合里面就放上了getId,getName,getAge methodNames[index] = "get" + v; str1 += s + ","; index++; } str1 = str1.substring(0, str1.length() - 1); String str2 = ""; for (int i = 0; i < cfs.size(); i++) { str2 += "?,"; } str2 = str2.substring(0, str2.length() - 1); String sql = "insert into " + tableName + "(" + str1 + ")" + "values(" + str2 + ")"; // 8、这段sql== // insert into _table(id,name,age)values(?,?,?); return sql; } }
最后测试代码:
package JunitTest; import csg.hibernate.entity.Session; import csg.hibernate.entity.Student; /** * * @author Caesar.hu * @Date 2014-11-28 * @Time 上午09:32:15 * @TODO */ public class Test { public static void main(String[] args) throws Exception{ Student student=new Student(); Session s=new Session(); student.setId(1); student.setAge(12); student.setName("张三"); s.save(student); } }
1
2
3
|
Configuration cfg= new Configuration(); cfg.configure(); sessionFactory=cfg.buildSessionFactory(); |
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。