hibernate 一级缓存以及查询

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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值