一、Hibernate进阶
1. 实体类编写规则
1. 实体类里的属性是私有的
2. 实体类里的私有属性使用公开的set和get方法操作
3. 要求实体类中有一个属性唯一标识实体类(一般使用ID值)
4. 实体类中的属性建议不使用基本数据类型,而使用基本数据类型对应的包装类
2. Hibernate主键生成策略
1. Hibernate要求实体类里有一个属性作为唯一值,对应表的主键,主键可以有不同的生成策略
2. Hibernate主键生成策略有很多值
<generator class=""/>
native:根据使用的数据库,帮助选择使用哪个值
uuid:Hibernate会自动生成UUID值,属性的类型必须是String类型
3. Hibernate实体类操作
1. CRUD操作
2.实体类对象状态
三种状态:
(1)瞬时态
对象里没有ID值,与Session没有关联
(2)持久态
对象里有ID值,与Session关联
(3)托管态
对象里有ID值,与Session没有关联
saveOrUpdate():
(1)实体类对象是瞬时态时,做添加操作
(2)实体类对象是托管态、持久态时,做更新操作
4. Hibernate的一级缓存
1. Hibernate中提供了很多的优化方式
2. Hibernate缓存的特点:
(1)Hibernate的一级缓存:
(a)默认是打开的
(b)HIbernate一级缓存的使用范围,是Session范围,从Session创建到Session关闭的范围
(c)在Hibernate的一级缓存中,存储数据必须是持久态
(2)Hibernate的二级缓存:
(a)目前已经不使用了,替代技术:Redis
(b)二级缓存不是默认打开的,需要配置
(c)二级缓存范围,是SessionFactory范围
3. Hibernate一级缓存特性
(1) 持久态自动更新数据库
5. Hiberante的事务操作
1. 什么是事务
2. 事务特性
3. 不考虑隔离性产生问题
(1)脏读
(2)不可重复读
(3)虚读
4. 设置事务隔离级别
(1)Mysql默认隔离级别 repatable read
5. 事务代码的规则写法
(1)代码结构
try{
开启事务
提交事务
}catch(){
回滚事务
}finally{
关闭资源
}
6. Hibernate绑定Session
(1) Hibernate实现了绑定Session,底层是使用ThreadLocal实现
(2) 获取本地线程Session
(a) 在Hibernate核心配置文件中配置
<property name="hibernate.current_session_context_class">thread</property>
(b)调用SessionFactory的方法得到
SessionFactory.getCurrentSession()
获取与本地线程绑定的Session时,关闭Session报错,所以不需要手动关闭,但是使用openSession方法获得Session时需要手动关闭Session
6. Hibernate的其他API
1. Query
(1) 不需要写SQL语句,但是需要写HQL语句
(2) HQL与SQL的区别:
(a) SQL操作的是数据库中的表
(b) HQL操作的是实体类和属性
(3) 查询所有的HQL语句:
from 实体类名称
(4)使用:
(a) 创建Query对象
Query query = Session.createQuery(" FROM User")
(b) 调用Query对象里的方法得到结果
List<User> list = query.list()
2. Criteria
(1) 不需要写语句,直接调用方法实现
(2) 使用:
(a)创建Criteria对象
Criteria criteria = Session.createCriteria(User.class)
(b) 调用Query对象里的方法得到结果
List<User> list = criteria.list()
3. SQLQuery
(1) 使用Hibernate时,也可以调用底层SQL实现
(2) 使用:
(a)创建SQLQuery对象
SQLQuery sqlQUery = Session.createSQLQuery("SELECT * from t_user")
(b) 调用SQLQuery对象里的方法得到结果,返回list集合,默认每部分为数组
List<Object[]> list = sqlQuery.list()
设置返回的每部分是实体对象:
SQLQuery.addEntity(User.class)