Hibernate的出现和Hinbernate的简单模拟实现
来源:互联网 发布:软件测试费用标准 编辑:程序博客网 时间:2024/06/07 00:49
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?
- 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
5. 创建Test类
[java]view plaincopyprint?
- 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);}}
6. 创建Session类
[java]view plaincopyprint?
- 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;}}
测试结果:
id,age,name
?,?,?
Insert into student(id,age,name)values(?,?,?)
getId|int
getAge|int
getName|java.lang.String
?,?,?
Insert into student(id,age,name)values(?,?,?)
getId|int
getAge|int
getName|java.lang.String
查看数据库
Hibernate总结:
Hibernate是一个很优秀的框架,确实能减轻程序员的开发数据库的繁杂,其实最重要的是一种解决方案的思想,而我学习框架的初衷也就是学习框架思想,有了思想,就不会被技术禁锢在一个尴尬的境地。
0 0
- Hibernate的出现和Hinbernate的简单模拟实现
- Hibernate的简介和Hinbernate的简单模拟实现
- 简单模拟hibernate的实现原理
- 简单模拟实现hibernate
- call,apply简单的模拟和实现
- Hibernate学习_001_模拟hibernate的实现
- hibernate的简单实现
- hibernate的简单实现
- RSA的简单模拟实现
- 模拟计算器的简单实现
- map的简单模拟实现
- 简单模拟vector的实现
- 使用java简单模拟ping和telnet的实现
- 使用java简单模拟ping和telnet的实现
- 使用java简单模拟ping和telnet的实现
- 使用java简单模拟ping和telnet的实现
- 使用java简单模拟ping和telnet的实现
- 一个简单模拟内存分配和释放的实现
- 轻量级ORM框架——第一篇:Dapper快速学习
- Java面向对象-构造方法,this关键字
- Hibernate缓存
- 2016 大连网络赛 hdu 5876 ACM ICPC(补图求最短路)
- Android 打造自己的滚动选择器ScrollSelector
- Hibernate的出现和Hinbernate的简单模拟实现
- bzoj1078
- hdu 5875 ACM/ICPC Dalian Online 1008 Function
- 重载赋值函数与复制构造函数
- 13. Roman to Integer
- 技术博客地址
- 原生表单提交的方式
- HDU3339-In Action(最短路+01背包)
- 用OpenCV实现Photoshop算法(七): 调整色相饱和度