mybatis的缓存

mybatis的缓存分为一级缓存、二级缓存
那么,我们为什么要使用缓存呢?

       对于经常查询的并且不经常改变的数据,如果每次查询都要与数据库进行交互,这样就大大降低了效率,所以这里就引入了缓存,将一些对结果影响不大且经常查询的数据存放在内存中,从而减少与数据库的交互来提高效率,这就是缓存的优势。

一级缓存

       一级缓存是SqlSession级别的缓存(默认是支持一级缓存,不需要再配置文件中配置一级缓存),在操作数据库时,每个SqlSession类的实例对象中有一个数据结构(HashMap)可以用来存储缓存数据,不同的SqlSession类的实例对象缓存的数据区域(HashMap)是互不影响的。当在同一个SqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据写到内存中,第二次查询不执行sql直接从内存中获取。

public class MyBatisTest {
	//mybatis的一级缓存,是SqlSession级别的缓存,只有一个SqlSession对象。
	@Test
	public void test1(){
		SqlSessionFactory ssf=MyBatisUtil.getFactory();
		SqlSession session=ssf.openSession();
		UserMapper um1=session.getMapper(UserMapper.class);
		User user1=um1.selectbyid(1);
		System.out.println(user1.getUsername());
		//session.clearCache();//清理缓存
		//session.commit();//模拟增删改
		UserMapper um2=session.getMapper(UserMapper.class);
		User user2=um2.selectbyid(1);
		System.out.println(user2.getUsername());
		session.close();
	}
}

结果:
由此可见,因为缓存,只发生了一次与数据库的交互

如何清理缓存?

方法一:模拟增删改

session.commit();

方法二:调用clearCache()方法

session.clearCache();

而清理缓存后:在这里插入图片描述

二级缓存

       二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。对于访问多的查询请求且用户对查询结果实时性要求不高,此时便可采用mybatis的二级缓存。
在这里插入图片描述
1.启动
在核心配置文件mybatis-config.xml中加入

<settings>
	<setting name="cacheEnabled" value="true"/>
</settings>

2.调用实体类实现序列化接口
在这里插入图片描述
实现序列化接口的目的:
     ·为了将数据取出执行反序列化操作
     ·标记接口,打个标记,表示具有一些功能,可以被其它功能对象调用
     ·序列号有方法,可以将对象序列化成二进制文件,也可以将二进制文件反序列化成对象
3.在对应的mapper.xml中加入cache标签
在这里插入图片描述
4.测试

@Test
	public void test2(){
	//mybatis的二级缓存,是mapper级别的缓存,有多个SqlSession对象。
		SqlSessionFactory ssf=MyBatisUtil.getFactory();
		SqlSession session1=ssf.openSession();
		SqlSession session2=ssf.openSession();
		SqlSession session3=ssf.openSession();
		UserMapper um1=session1.getMapper(UserMapper.class);
		User user1=um1.selectbyid(1);
		System.out.println(user1.getUsername());
		session1.close();
		
		UserMapper um2=session2.getMapper(UserMapper.class);
		User user2=um2.selectbyid(1);
		System.out.println(user2.getUsername());
		session2.close();
		
		UserMapper um3=session3.getMapper(UserMapper.class);
		User user3=um3.selectbyid(1);
		System.out.println(user3.getUsername());
		session3.close();
	}

运行结果:在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值