1 概念

Hibernate是一种免费的开源的Java语言下的对象关系映射解决方案

Hibernate 有个在.NET Framework 上的实现版本,称为 NHibernate

1.1   为什么出现Hibernate

l  阻抗不匹配

l  如果有对象数据库,hibernate就没用了

1.2   Hibernate在做什么

l  存储

l  查询、加载

l  缓存

体系结构图

1.3   优点

l  sql语句不用写了,只需要操纵对象,使开发更对象化

l  移植性好

l  提高开发效率

l  透明持久化,不需要实现任何类,任何接口。Pojo类没有实现任何第三方的接口。即没有侵入性

l  轻量级的框架,不依赖于容器

1.4   缺点

l  额外的学习成本

l  配置麻烦

l  复杂的查询效率不高,

l  批量修改、删除效率不高

l  大量数据的查询效率不高

1.5   使用场合

l  不想写sql

l  需要跨平台。

1.6   不宜使用的场合

l  实体关系太复杂

l  需要数据库的特定优化机制

l  需要使用存储过程

l  批量更新,批量删除不适合

Hibernate的模拟实现
1. 创建Java项目:Hibernate_OR_Mapping_Simulation
2. 创建包:com.wwj.hibernate.model
3.  创建Student类
/Student.java
[java]view plaincopyprint?
  1. package com.wwj.hibernate.model;
  2. /**
  3. *
  4. * @author blossom
  5. * Student模型类
  6. *
  7. */
  8. public class Student {
  9. private int id;
  10. private String name;
  11. private int age;
  12. public int getId() {
  13. return id;
  14. }
  15. public void setId(int id) {
  16. this.id = id;
  17. }
  18. public String getName() {
  19. return name;
  20. }
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. public int getAge() {
  25. return age;
  26. }
  27. public void setAge(int age) {
  28. this.age = age;
  29. }
  30. }
package com.wwj.hibernate.model;/*** * @author blossom* Student模型类**/
public class Student {private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

4. 创建包Test

5. 创建Test类
[java]view plaincopyprint?
  1. package test;
  2. import com.wwj.hibernate.model.Student;
  3. /**
  4. *
  5. * @author blossom
  6. *
  7. */
  8. public class Test {
  9. public static void main(String[] args) throws Exception{
  10. Student stu = new Student();    //定义一个Student类对象
  11. //设置属性值
  12. stu.setId(3);
  13. stu.setName("lishi");
  14. stu.setAge(22);
  15. //生成自定义的Session对象
  16. Session session = new Session();
  17. //执行Session类中的save方法
  18. session.save(stu);
  19. }
  20. }
package test;import com.wwj.hibernate.model.Student;/*** * @authorblossom**/
public class Test {public static void main(String[] args) throws Exception{Student stu = new Student();    //定义一个Student类对象//设置属性值stu.setId(3);                    stu.setName("lishi");stu.setAge(22);//生成自定义的Session对象Session session = new Session();//执行Session类中的save方法session.save(stu);}
}
6. 创建Session类
[java]view plaincopyprint?
  1. package 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.util.HashMap;
  7. import java.util.Map;
  8. import com.wwj.hibernate.model.Student;
  9. /**
  10. * 模拟Hibernate中的Session实现的功能
  11. * @author blossom
  12. * @date  2016/4/14
  13. */
  14. public class Session {
  15. String tableName = "student";   //表名
  16. Map<String,String> cfs = new HashMap<String, String>(); //字段名与属性一一对应的关系
  17. String[] methodNames;       //声明一个字符串数组,用来存储方法名
  18. /**
  19. * Session的构造方法
  20. */
  21. public Session(){
  22. cfs.put("id", "id");
  23. cfs.put("name", "name");
  24. cfs.put("age", "age");
  25. methodNames = new String[cfs.size()];
  26. }
  27. /**
  28. * 实现数据插入功能
  29. * @param stu
  30. * @throws Exception
  31. */
  32. public void save(Student stu) throws Exception{
  33. String sql = createSql();       //获取拼接完成的sql语句
  34. Class.forName("com.mysql.jdbc.Driver");         //加载MySQL数据库驱动
  35. //获取数据库连接
  36. Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/hibernate","root", "wwj");
  37. //创建PreparedStement对象
  38. PreparedStatement ps = conn.prepareStatement(sql);
  39. for(int i = 0; i < methodNames.length; i++) {
  40. //利用Java的反射机制,获取对象的方法
  41. Method m = stu.getClass().getMethod(methodNames[i]);
  42. Class r = m.getReturnType();    //获取方法返回值类型
  43. if(r.getName() == "java.lang.String"){  //如果返回值类型等于”java.lang.String"的话
  44. String v = (String)m.invoke(stu);   //对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
  45. ps.setString(i + 1, v);             //将指定参数设置为给定 Java String 值。
  46. }
  47. if(r.getName() == "int"){
  48. Integer v = (Integer)m.invoke(stu);
  49. ps.setInt(i + 1, v);
  50. }
  51. System.out.println(m.getName() + "|" + r.getName());
  52. }
  53. ps.executeUpdate();         //执行sql语句更新数据库
  54. ps.close();                 //释放此PrepareStatement对象的数据库和JDBC资源
  55. conn.close();               //关闭数据连接
  56. }
  57. /**
  58. * 创建SQL语句
  59. * @return
  60. */
  61. private String createSql() {
  62. //拼接字段
  63. String str1 = "";
  64. int index = 0;
  65. for(String s : cfs.keySet()) {
  66. String v = cfs.get(s);
  67. v = Character.toUpperCase(v.charAt(0)) + v.substring(1);
  68. methodNames[index] = "get" + v;
  69. index++;
  70. str1 += s + ",";
  71. }
  72. str1 = str1.substring(0, str1.length() - 1);        //去掉最后面的逗号","
  73. System.out.println(str1);
  74. //拼接(?,?,?,?),问号的个数取决于map的长度
  75. String str2 = "";
  76. for(int i = 0; i < cfs.size(); i++){
  77. str2 += "?,";
  78. }
  79. str2 = str2.substring(0, str2.length() - 1);
  80. System.out.println(str2);
  81. //拼接sql字符串
  82. String sql = "Insert into " + tableName + "(" + str1 + ")" + "values" + "(" + str2 + ")";
  83. System.out.println(sql);
  84. return sql;
  85. }
  86. }
package test;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;import com.wwj.hibernate.model.Student;/*** 模拟Hibernate中的Session实现的功能* @author blossom* @date  2016/4/14*/
public class Session {String tableName = "student";  //表名Map<String,String> cfs = new HashMap<String, String>();    //字段名与属性一一对应的关系String[] methodNames;        //声明一个字符串数组,用来存储方法名/*** Session的构造方法*/public Session(){cfs.put("id", "id");cfs.put("name", "name");cfs.put("age", "age");methodNames = new String[cfs.size()];  }/*** 实现数据插入功能* @param stu* @throws Exception*/public void save(Student stu) throws Exception{String sql = createSql();      //获取拼接完成的sql语句Class.forName("com.mysql.jdbc.Driver");         //加载MySQL数据库驱动//获取数据库连接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/hibernate","root", "wwj");//创建PreparedStement对象PreparedStatement ps = conn.prepareStatement(sql);for(int i = 0; i < methodNames.length; i++) {//利用Java的反射机制,获取对象的方法Method m = stu.getClass().getMethod(methodNames[i]);  Class r = m.getReturnType();   //获取方法返回值类型if(r.getName() == "java.lang.String"){   //如果返回值类型等于”java.lang.String"的话String v = (String)m.invoke(stu);  //对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。ps.setString(i + 1, v);                //将指定参数设置为给定 Java String 值。}if(r.getName() == "int"){       Integer v = (Integer)m.invoke(stu);ps.setInt(i + 1, v);}System.out.println(m.getName() + "|" + r.getName());}ps.executeUpdate();          //执行sql语句更新数据库ps.close();                   //释放此PrepareStatement对象的数据库和JDBC资源conn.close();             //关闭数据连接}/*** 创建SQL语句* @return*/private String createSql() {//拼接字段String str1 = "";int index = 0;for(String s : cfs.keySet()) {String v = cfs.get(s);v = Character.toUpperCase(v.charAt(0)) + v.substring(1);methodNames[index] = "get" + v;index++;str1 += s + ","; }str1 = str1.substring(0, str1.length() - 1);      //去掉最后面的逗号","System.out.println(str1);//拼接(?,?,?,?),问号的个数取决于map的长度String str2 = "";for(int i = 0; i < cfs.size(); i++){str2 += "?,";}str2 = str2.substring(0, str2.length() - 1);System.out.println(str2);//拼接sql字符串String sql = "Insert into " + tableName + "(" + str1 + ")" + "values" + "(" + str2 + ")";System.out.println(sql);return sql;}}

测试结果:

id,age,name
?,?,?
Insert into student(id,age,name)values(?,?,?)
getId|int
getAge|int
getName|java.lang.String
查看数据库
Hibernate总结:
Hibernate是一个很优秀的框架,确实能减轻程序员的开发数据库的繁杂,其实最重要的是一种解决方案的思想,而我学习框架的初衷也就是学习框架思想,有了思想,就不会被技术禁锢在一个尴尬的境地。

Hibernate的出现和Hinbernate的简单模拟实现相关推荐

  1. IoC容器总结与简单模拟

    IoC容器总结与简单模拟 当一个组件需要外部资源时,最直接也最明智的方法是执行查找,这种行为称为主动查找.但这种查找存在一个缺点--组件需要知道如何获得资源.那么它的解决方案是什么呢?请看下文. AD ...

  2. 使用动态代理简单模拟一下spring的事务管理

    按照平时写代码的习惯,我们会定义一个service接口 package com.proxy.test; public interface UserService {public void sayHel ...

  3. 7-18 银行业务队列简单模拟 (25 分)

    7-18 银行业务队列简单模拟 (25 分) 设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 -- 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客.给定到达 ...

  4. Jmeter简介以及简单模拟性能测试

    1.Jemter简介 1.我们为什么使用Jmeter 开源,免费,基于Java编写,可集成到其他系统可拓展各个功能插件 支持接口测试, 压力(负载和压力)测试等多种功能,支持录制回放, 入门简单相较于 ...

  5. JavaWeb学习总结(四十九)——简单模拟Sping MVC

    在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...

  6. 银行业务队列简单模拟 (25 分)c语言c++

    7-2 银行业务队列简单模拟 (25 分) 设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 -- 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客.给定到达银 ...

  7. NYOJ 题目77 开灯问题(简单模拟)

    开灯问题 时间限制:3000 ms  |            内存限制:65535 KB 难度:1 描述 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯 ...

  8. FZU - 2202 犯罪嫌疑人(逻辑思维+简单模拟)

    题目链接:点击查看 题目大意:给出n和m,代表有n个人,每个人说一句话,指认一个人是无辜还是罪犯,总共有m个人说了真话,问每个人说话的真实性 题目分析:一拿到这个题目我是懵逼的..因为n给到了1e5, ...

  9. 7-45 银行业务队列简单模拟 (10 分)

    7-45 银行业务队列简单模拟 (10 分) 设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 -- 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客.给定到达 ...

最新文章

  1. Mysql的“Table ‘mysql.servers‘ doesn‘t exist”的解决方法
  2. efcore mysql autofac_Asp.NetCore3.1版本的CodeFirst与经典的三层架构与AutoFac批量注入
  3. php中文网企业网站,闻名 PHP企业网站系统 weenCompany v5.3.0 简体中文 UTF8
  4. 如何做一个优秀的销售代表
  5. boost::range模块实现map_keys相关的测试程序
  6. 当我们在谈论HTTP缓存时我们在谈论什么
  7. 关于python_关于 Python
  8. java ee me se_java EE ME SE有什么关系
  9. java 字符串倍_java字符串拼接与性能分析详解
  10. etcher制作mac启动盘_如何在Mac上创建和引导Linux USB驱动器
  11. 【转】SQL Server联机丛书:存储过程及其创建
  12. MMKV_MMKV简介
  13. CodeBlocks下载及安装教程(小白图解)
  14. 用友业务单据生成凭证如何修改凭证金额
  15. 从微信服务通知进入小程序显示环境加载失败,请稍后再试
  16. DOE全因子实验设计报告
  17. win7环境下计算机互联,win7系统多台电脑互联起来的操作方法
  18. 量子计算机不能解决的问题,量子计算机破产问题传统计算机无法解决
  19. 【Unity 22】 Unity 力,扭矩,刚体,触发器的简单使用
  20. ubuntu chmod 和 chown 命令用法

热门文章

  1. ajax post提交数据_JavaEE学习——为什么get请求方式比post请求方式效率高
  2. 西南交大计算机辅助制造a卷,计算机辅助制造 西南交大作业.doc
  3. Unity URP一分钟实现遮挡透视
  4. mysql client version_下载mysqlclient问题报错
  5. 如何在ngRepeat中使用Bootstrap Span元素
  6. 你是否为类编写接口?我乞求你停下!
  7. mysql是表级锁还是行级锁_带你了解MySQL数据库中的全局锁、表级锁、行级锁
  8. mybatis-generator配置流程(详细) 2021-05-15
  9. 计算机科学与技术 net,计算机科学与技术
  10. anaconda没有vscode_Ubuntu18.04安装Anaconda3和VSCode指南