hibernate 一级缓存
什么是缓存?
1.数据存到数据库里面,数据库本身是文件系统,使用流操作文件效率不是很高。
(1)把数据存到内存里面,不需要使用流方式。可以直接读取内存中数据
(2)把数据放到内存中,提高读取效率。
hibernate缓存
1.hibernate框架中提供了很多优化方式。hibernate的缓存就是一个优化方式
2.hibernate缓存特点:
第一类hibernate的一级缓存
(1)hibernate的一级缓存是默认打开的。
(2)hibernate的一级缓存使用范围,是session范围,从session创建到session关闭范围
(3)hibernate的一级缓存中,存储数据必须是 持久态数据
第二类 hibernate的二级缓存
(1)目前已经不使用了,替代技术redis.
(2)二级缓存默认不是打开的,需要配置
(3)二级缓存使用范围,是sessionFactory范围
验证一级缓存的存在
验证方式
(1)首先根据uid=1查询,返回对象
User user = session.get(User.class,1);
输出…
首先查询一级缓存,发现没数据之后,会去数据库查询,返回user对象。
(2)其次再根据uid=1查询,返回对象
User user = session.get(User.class,1);
输出…
第二次查询一级缓存,在一级缓存中找到相同的数据,直接返回。
一级缓存特性
持久态会自动更新数据库
User user = session.get(User.class,7);
user.setUserName(“刘亦菲”);
//session.update();
tx.commit();//提交之后会把这个对象进行更新
查询的对象会分别放到一级缓存和快照区中
修改user对象属性时,会修改持久态对象的值,
同时会修改一级缓存中的内容,但是不会修改一级缓存对应的快照区内容。
最后提交事务时,
会比较一级缓存内容和对应快照区内容是否相同,
如果不相同,把一级缓存内容更新到数据库里面。
如果相同,不会更新到数据库
一级缓存(hibernate创建session时产生)
一级缓存 对应的 快照区(副本)
事务相关概念
1.什么是事务?
2.事务特性
3.不考虑隔离性产生问题
(1)脏读
(2) 不可重复读
(3) 虚读
4.设置事务隔离级别
(1)mysql默认隔离级别 repeatable read
hibernate 绑定 session
1.session类似于jdbc的connection,web阶段学过的ThreadLoacal
2.框架帮我们实现与本地线程的绑定
3**.获取与本地线程session**
(1)在hibernate中核心配置文件中配置
核心配置文件:<property name = "hibernate.current_session_context_class" >thread</property>
(2)调用sessionFactory里面的方法得到
public static Session getSessionObject(){
return sessionFactory.getCurrentSession();
}
3.获取与本地线程绑定的时候,关闭session报错,不需要手动关闭了。
hibernate 的查询操作( api 的使用)
**1.Query对象**
(1)使用query对象,不需要写sql语句,但是写hql语句
hql: (hibernate query language) hibernate查询语言,这个hql语句和普通的sql很相似
(2)hql 与 sql语句区别
使用sql操作表和字段
使用hql操作实体类和属性
查询所有的hql语句
from 实体类名称
(3)query对象的使用
1.创建query对象
方法里面写hql语句
Query query = session.creatQuery("from User");
2.调用query对象里面的方法得到结果
List<User> list = query.list();
**2.Criteria对象**
(1)使用这个对象查询操作,但是使用这个对象的时候,不需要写语句,直接调 用方法实现
实现过程:
1.创建criteria对象
Criteria cirteria = session.creatCriteria(User.class);
2.调用对象里的方法得到结果
List<User> list = cirteria.list();
**3.SQLQuery对象**
使用hibernate,调用底层sql实现
实现过程:
1.创建SQLQuery对象
SQLQuery sqlQuery = session.creatSQLQuery("select * from t_user");
2.调用对象里的方法得到结果
//返回的list的集合,默认里面的每部分是数组结构
// List<Object [] > list = sqlQuery.list();
处理返回list每部分是对象
sqlQuery.addEntity(User.class);
List<User> list = sqlQuery.list();