Mybatis的缓存

概念和使用场景

  1. 缓存的概念:存在于内存中的临时数据。
  2. 为什么使用缓存:减少和数据库的交互次数,提高执行效率。
  3. 适用于缓存的数据:经常查询并且不经常改变的,数据的正确与否对最终结果影响不大的。
  4. 不适用于缓存的数据:经常改变的,数据的正确与否对最终结果影响很大的。

一级缓存

一级缓存指的是Mybatis中SqlSession对象的缓存。
当执行查询之后,查询的结果会同时存入到SqlSession提供一块区域中。
该区域的结构是一个Map。当再次查询同样的数据,Mybatis会先去sqlsession中
查询是否有该数据,有的话直接使用不再访问数据库。
当SqlSession对象销毁时,Mybatis的一级缓存随之销毁。

测试一级缓存
	@Test
    public void testFirstLevelCatch() {
        User user1 = userDao.findById(41);
        System.out.println(user1);
        User user2 = userDao.findById(41);
        System.out.println(user2);

        System.out.println(user1 == user2);
    }
测试结果

在这里插入图片描述

测试SqlSession对象销毁时一级缓存是否销毁
@Test
    public void testFirstLevelCatch() {
        User user1 = userDao.findById(41);
        System.out.println(user1);

        sqlSession.close();
        sqlSession= factory.openSession();
        userDao = sqlSession.getMapper(IUserDao.class);
        User user2 = userDao.findById(41);
        System.out.println(user2);

        System.out.println(user1 == user2);
    }
测试结果

在这里插入图片描述

注意事项:
  1. clearCache()方法也可以清空一级缓存。
  2. 当调用SqlSession的修改,添加,删除,commit(),close()等方法时会清空一级缓存。

二级缓存:

二级缓存指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。
二级缓存的使用步骤:

  • 第一步:让Mybatis框架支持二级缓存,在主配置文件中配置。
	<settings>
        <setting name="cacheEnabled" value="true"></setting>
    </settings>
  • 第二步:让当前的映射文件支持二级缓存。
<cache></cache>
  • 第三步:让当前的操作支持二级缓存,在标签中配置。
	<select id="findById" parameterType="INT" resultType="user" useCache="true">
        select * from user where id = #{uid}
    </select>
测试代码
	@Test
    public void testFirstLevelCatch() {
        SqlSession sqlSession1 = factory.openSession();
        IUserDao dao1 = sqlSession1.getMapper(IUserDao.class);
        User user1 = dao1.findById(41);
        System.out.println(user1);
        sqlSession1.close();

        SqlSession sqlSession2 = factory.openSession();
        IUserDao dao2 = sqlSession2.getMapper(IUserDao.class);
        User user2 = dao2.findById(41);
        System.out.println(user2);
        sqlSession1.close();

        System.out.println(user1 == user2);
    }
测试结果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值