## Hibernate第二天 ##
### 回顾与反馈 ###
Hibernate第一天
1)一种思想 : ORM OM(数据库表与实体类之间的映射) RM
2)一个项目 : CRM 客户关系管理系统 客户公司表
3)一个框架 : Hibernate 简化JDBC 面向对象的数据库操作
注意问题 : Hibernate简化了操作 但是牺牲了SQL的执行性能
线程问题 数据库连接放到线程
程序世界 程序运行期间 进程(一个软件运行期间驻留在内存中的一个程序) 与
进程接收到执行任务的时候 它就会创建一个线程去帮助我完成
这个任务
程序运行期间 内存里有一个进程 进程要做某些事情交给具体的线程
多线程
### 课程安排 ###
1. Hibernate的持久化类和对象标示符
2. Hibernate的一级缓存和对象状态
3. Hibernate的事务控制
4. Hiberante查询对象的API
### 重点内容 ###
1. Hibernate的持久化类和对象标示符
a. 描述Hibernate持久化类及编写规则
- 持久化类 : 持久化 某个java的普通类与表建立映射关系之后
- 规范
- 1) 持久化类需要无参的构造
- 2) 属性都是私有的 提供get set方法
- 3) 持久化类的属性都是包装类型 null int(0) Integer(null)
- 4) 持久化类中必须有一个属性与主键字段对应
- 5) implements Serializable
- JavaBean : Bean(豆角)-->封装思想 Java 玩积木
- Serializable 序列化 java对象-->保存到硬盘里的技术
- OID 表的主键ID --> 程序里被标记成<id>标签里面的属性
- 1) Hibernate用于区分两个对象的唯一途径
- 2) 对象标示符可以帮助session完成查询性能的优化
b. Hibernate中常用的主键生成策略
- 数据库主键
- Grade g_id g_name g_desc
- 一个汉字 2 字节 一个数字 1字节
- 主键要求 唯一
- 自然主键 : g_name(业务中的某个字段拿来当主键) 省了一个字段
- 代理主键(推荐) : 不参与真实业务的字段 只为数据库方便管理的主键
- Hibernate主键自增策略:
- native : 让数据库自己决定主键如何生存适合于能主键自增的数据(mysql sqlserver)
- sequence : 使用序列来生成主键,有的数据库不支持主键自增(Oracle)
- identity : 采用数据库的主键自增来生成主键(mysql,sqlserver,DB2)
- uuid : 根据128位数据算法生成32为的一个字母+数字的字符串用来标识主键
- uuid : 当你一个程序使用两个数据库的时候必须使用UUID作为同名表的主键ID; 数据1 数据2 userinfo (1 2 3 4) (1 2 3 4)
- 整理Hibernate的时候需要注意 : jar包 配置文件
2. Hibernate的一级缓存和对象状态
a. 能够描述Hibernate的一级缓存
- 缓存 : 临时存储硬盘数据到内存中的一项技术;
- 程序运行在内存里 所以当读取数据的时候 内存读内存 内存读硬盘快
- redis(2000)
- Hibernate为了提升查询性能也进行了缓存操作-->Session
- Session的一级缓存 是Hibernate用于进行数据库与程序之间沟通的一个桥;
- 当程序完成持久化操作的时候Hibernate会通过Session把该对象与相对应的数据库中的数据关联到一起;
- 快照机制 : 说明了session不光可以缓存数据库中的数据,还可以管理数据库中的数据,但是要注意快照机制只能简化更新操作;
- 缓存与快照机制保证了数据库的简化及性能提升操作;
b. Hibernate持久化对象的三种状态及特征
- Hibernate管理数据库表数据库的时候有个问题
- Java 类的对象
- Hibernate Session 管理的对象
- Hibernate管理Java对象的时候因为根据数据库数据对应于session管理不同分为三种状态
- 持久化 : 数据库有数据对应 被session管理
- 瞬时对象 : 数据库没有数据对应 session不管理
- 游离状态 : 数据库有数据对应 但是session不管理
- 操作 :
- 1) 添加的一定是瞬时的!
- 2) 更新和修改的一定是持久的!
3. Hibernate的事务控制
a. Hibernate进行事务控制
- 事务四大特性 多线程环境下事务并发问题 脏读 .....
- 事务隔离级别的设置
- 读未提交 最危险 事务操作最快 1
- 读已提交 比较适合 2
- 可重复读 比较笨拙 4
- 串行读 最安全 事务操作最慢 8
如果一旦出现事务隔离级别的设置 肯定涉及到多线程并发操作
JavaSE开发 单线程
b. 线程与session绑定的时候
1) 自定线程类与session绑定
private static ThreadLocal<Session> sessionTL = new ThreadLocal<Session>();
public static Session getSession(){
// 创建方法返回值
Session session = null;
// 1. 放到线程里 2.C3P0
// 当前线程先获取一下
session = sessionTL.get();
if(null == session){
session = factory.openSession();
// 把session放入当前线程
sessionTL.set(session);
}
// 返回
return session;
}
特点 : 查询方法不用加事务 但是编写其来麻烦
2) Hibernate默认绑定
<property name="hibernate.current_session_context_class">thread</property>
public static Session getCurrentSession(){
// 使用hibernat默认的session与线程绑定
return factory.getCurrentSession();
}
特点: 编写简单,但是所有的方法都必须加上事务才可以运行
4. Hiberante查询对象的API
X. 问题:不能查询所有
a. Query对象的作用及常用的方法
- HQL查询 : Hibernate query la...
- HQL查询 : Hibernate还是属于一种SQL查询;保留SQL结构,查询表被替换成类,查询字段被替换成属性;
- query查询 query对象 -->离开session
b. Criteria对象的作用及常用的方法
Criteria 可以离开session独立生存
### 课后总结 ###
作业: Hibernate+servlet完成一张表的CURD 分页
封装: 三层开发
原文地址:https://www.cnblogs.com/shan1393/p/9058320.html