Mybatis二级缓存

二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。

使用步骤:
1.SqlMapConfig.xml中配置(此步骤可省略)`

<settings>
  <!-- 开启二级缓存的支持 --> 
  <setting name="cacheEnabled" value="true"/>
</settings>
因为 cacheEnabled 的取值默认就为 true,所以这一步可以省略不配置。为 true 代表开启二级缓存;为
false 代表不开启二级缓存。

2.配置相关的 Mapper 映射文件

<mapper namespace="">
<!-- 开启二级缓存的支持,仅代表此处namespace映射支持二级缓存 -->
   <cache></cache>
</mapper>

3.配置 statement 上面的 useCache 属性

<!-- 根据 id 查询 --> 
<select id="findById" resultType="user" parameterType="int" useCache="true">
     select * from user where id = #{uid}
</select> 
<!--将 UserDao.xml 映射文件中的<select>标签中设置 useCache=true”代表当前这个 statement 要使用
二级缓存,如果不使用二级缓存可以设置为 false。
注意:针对每次查询都需要最新的数据 sql,要设置成 useCache=false,禁用二级缓存。-->

测试代码

        private InputStream in;
        private SqlSessionFactory factory;
        @Before//用于在测试方法执行之前执行
        public void init()throws Exception{
            //1.读取配置文件,生成字节输入流
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            //2.获取 SqlSessionFactory
            factory = new SqlSessionFactoryBuilder().build(in);
        }
        @After//用于在测试方法执行之后执行
        public void destroy()throws Exception{
            in.close();
        }
        /**
         * 测试二级缓存
         */
        @org.junit.Test
        public void testFirstLevelCache(){
            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);
            sqlSession2.close();
            System.out.println(user1 == user2);
        }

执行结果

可见两个对象并不相同,二级缓存中存储的数据类型并不是Object类型,而是在重新查询时将类似{username:value,address:‘北京’,…}重新封装返回。
注意,启用二级缓存的实体类需要实现 java.io.Serializable 接口,这样才可以使用序列化方式来保存对象。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值