SSM框架——Mybatis(8)使用缓存

Mybatis中使用缓存的概念

  • 缓存:存在于内存中的临时数据。
  • 使用缓存的原因:减少和数据库的交互次数,提高执行效率。
  • 使用场所:
    • 适用于缓存:经常查询并且不经常改变的。数据的正确与否对最终结果影响不大的。
    • 不适用于缓存:经常改变数据,数据的正确与否对最终结果影响很大的。

Mybatis中的一级缓存和二级缓存

一级缓存:

  • 指的是Mybatis中SqlSession对象的缓存。当我们执行查询之后,查询的结果会同时存入到SQLSession提供的一片区域中。
  • 该区域的结构是一个Map,当我们再次查询统一的数据时,就会查询是否有,有的话,就会直接拿出来使用。
  • 当SqlSession对象消失的时候,一级缓存也会没有。
  • 以下为测试用例和结果。
    @Test
    public void testFirstLevelCache(){
        User user1=userDao.findById(41);
        System.out.println(user1);

        session.clearCache();//清空一级缓存

        User user2=userDao.findById(41);
        System.out.println(user2);

        System.out.println(user1==user2);
    }

H@A~Z]XS9U[$ET_C{0%()IX.png

R@CJWV][L1L)(R4S_$QPZNW.png

  • 以上就是一级缓存的验证测试用例。当SqlSession进行添加、修改、删除、commit、close、clearCahe等操作时,就会触发清空一级缓存的操作。

二级缓存

  • 指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的、SqlSession共享的区域
  • 使用二级缓存的步骤:
    • 第一步:让Mybatis框架支持二级缓存(在Config文件中)
<settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
        <setting name="cacheEnabled" value="true"/>
    </settings>
    • 第二步:让当前的映射文件支持二级缓存(在对应的接口类配置文件中操作)在mapper标签下进行添加工作。
<!--开启二级缓存-->
    <cache/>
    • 让当前操作支持二级缓存(在select语句中进行配置)
<select id="findById" parameterType="java.lang.Integer" resultType="com.mybatis.User" useCache="true">
        select * from user where id=#{uid}
    </select>
  • 测试用例及结果
    @Test
    public void testSecondLevelCache(){
        SqlSession sqlSession1= factory.openSession();
        UserDao userDao1=sqlSession1.getMapper(UserDao.class);
        User user1=userDao1.findById(41);
        System.out.println(user1);
        sqlSession1.close();//一级缓存消失

        SqlSession sqlSession2= factory.openSession();
        UserDao userDao2=sqlSession2.getMapper(UserDao.class);
        User user2=userDao2.findById(41);
        System.out.println(user2);
        sqlSession2.close();//一级缓存消失

        System.out.println(user1==user2);
    }

QQ截图20201101103140.png

  • 这个截图就可以反映出已经进行了二级缓存,但是最后的结果还是false,原因就是:二级缓存中数据的存储不是以对象的形式,是以类似json的格式进行缓存的。当需要的时候,就会把需要的数据重写入新的对象中,导致这一现象的发生。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值