Hibernate的出现和Hinbernate的简单模拟实现
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 批量更新,批量删除不适合
- 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;
- }
- }
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
- package test;
- import com.wwj.hibernate.model.Student;
- /**
- *
- * @author blossom
- *
- */
- 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);
- }
- }
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);} }
- 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;
- }
- }
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;}}
测试结果:
?,?,?
Insert into student(id,age,name)values(?,?,?)
getId|int
getAge|int
getName|java.lang.String
Hibernate的出现和Hinbernate的简单模拟实现相关推荐
- IoC容器总结与简单模拟
IoC容器总结与简单模拟 当一个组件需要外部资源时,最直接也最明智的方法是执行查找,这种行为称为主动查找.但这种查找存在一个缺点--组件需要知道如何获得资源.那么它的解决方案是什么呢?请看下文. AD ...
- 使用动态代理简单模拟一下spring的事务管理
按照平时写代码的习惯,我们会定义一个service接口 package com.proxy.test; public interface UserService {public void sayHel ...
- 7-18 银行业务队列简单模拟 (25 分)
7-18 银行业务队列简单模拟 (25 分) 设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 -- 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客.给定到达 ...
- Jmeter简介以及简单模拟性能测试
1.Jemter简介 1.我们为什么使用Jmeter 开源,免费,基于Java编写,可集成到其他系统可拓展各个功能插件 支持接口测试, 压力(负载和压力)测试等多种功能,支持录制回放, 入门简单相较于 ...
- JavaWeb学习总结(四十九)——简单模拟Sping MVC
在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...
- 银行业务队列简单模拟 (25 分)c语言c++
7-2 银行业务队列简单模拟 (25 分) 设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 -- 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客.给定到达银 ...
- NYOJ 题目77 开灯问题(简单模拟)
开灯问题 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯 ...
- FZU - 2202 犯罪嫌疑人(逻辑思维+简单模拟)
题目链接:点击查看 题目大意:给出n和m,代表有n个人,每个人说一句话,指认一个人是无辜还是罪犯,总共有m个人说了真话,问每个人说话的真实性 题目分析:一拿到这个题目我是懵逼的..因为n给到了1e5, ...
- 7-45 银行业务队列简单模拟 (10 分)
7-45 银行业务队列简单模拟 (10 分) 设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 -- 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客.给定到达 ...
最新文章
- Mysql的“Table ‘mysql.servers‘ doesn‘t exist”的解决方法
- efcore mysql autofac_Asp.NetCore3.1版本的CodeFirst与经典的三层架构与AutoFac批量注入
- php中文网企业网站,闻名 PHP企业网站系统 weenCompany v5.3.0 简体中文 UTF8
- 如何做一个优秀的销售代表
- boost::range模块实现map_keys相关的测试程序
- 当我们在谈论HTTP缓存时我们在谈论什么
- 关于python_关于 Python
- java ee me se_java EE ME SE有什么关系
- java 字符串倍_java字符串拼接与性能分析详解
- etcher制作mac启动盘_如何在Mac上创建和引导Linux USB驱动器
- 【转】SQL Server联机丛书:存储过程及其创建
- MMKV_MMKV简介
- CodeBlocks下载及安装教程(小白图解)
- 用友业务单据生成凭证如何修改凭证金额
- 从微信服务通知进入小程序显示环境加载失败,请稍后再试
- DOE全因子实验设计报告
- win7环境下计算机互联,win7系统多台电脑互联起来的操作方法
- 量子计算机不能解决的问题,量子计算机破产问题传统计算机无法解决
- 【Unity 22】 Unity 力,扭矩,刚体,触发器的简单使用
- ubuntu chmod 和 chown 命令用法
热门文章
- ajax post提交数据_JavaEE学习——为什么get请求方式比post请求方式效率高
- 西南交大计算机辅助制造a卷,计算机辅助制造 西南交大作业.doc
- Unity URP一分钟实现遮挡透视
- mysql client version_下载mysqlclient问题报错
- 如何在ngRepeat中使用Bootstrap Span元素
- 你是否为类编写接口?我乞求你停下!
- mysql是表级锁还是行级锁_带你了解MySQL数据库中的全局锁、表级锁、行级锁
- mybatis-generator配置流程(详细) 2021-05-15
- 计算机科学与技术 net,计算机科学与技术
- anaconda没有vscode_Ubuntu18.04安装Anaconda3和VSCode指南