mybatis二级缓存案例

二级缓存是映射级别的缓存,多个sqlSession对象操作同一个映射的sql,多个sqlSession对象可以公用二级缓存。

开启二级缓存:(在对应的映射文件中设置)

<mapper namespace="com.cn.dao.GoodsDao">
    <!--开启二级缓存-->
    <cache></cache>

二级缓存需要给实体类设置序列化接口:
先在idea中设置:
在这里插入图片描述
实体类设置:
在这里插入图片描述
实体类添加序列化接口版本号:
(在类名上,alt+enter,选择第一个)
在这里插入图片描述

在这里插入图片描述
test:

    //二级缓存
    @Test
    public void testSelGoodsByGid2(){
    
    
        //通过工具类获取第一个sqlSession对象
        SqlSession session1 = SessionUtils.getSession();
        GoodsDao mapper1 = session1.getMapper(GoodsDao.class);
        Goods goods1 = mapper1.selGoodsByGid(4);
        System.out.println(goods1);
        //关闭或提交第一个会话,第一个会话的数据就会被保存到二级缓存中去
//        session1.close();
        session1.commit();
        System.out.println("------------");
        //通过工具类获取第二个sqlSession对象
        SqlSession session2 = SessionUtils.getSession();
        GoodsDao mapper2 = session2.getMapper(GoodsDao.class);
        //因为开启了二级缓存,会从二级缓存中查询数据,查询到了数据,就不会执行sql语句
        Goods goods2 = mapper2.selGoodsByGid(4);
        System.out.println(goods2);
    }

log4j:

DEBUG [main] - ==>  Preparing: select * from t_goods WHERE gid = ? 
DEBUG [main] - ==> Parameters: 4(Integer)
DEBUG [main] - <==      Total: 1
Goods{
    
    gid=4, gname='冰箱', gprice=3155.55, gcount=30, gdate=Sat Aug 15 00:00:00 CST 2020}
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@2d2e5f00]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@2d2e5f00]
DEBUG [main] - Returned connection 758013696 to pool.
------------
DEBUG [main] - Cache Hit Ratio [com.cn.dao.GoodsDao]: 0.5
Goods{
    
    gid=4, gname='冰箱', gprice=3155.55, gcount=30, gdate=Sat Aug 15 00:00:00 CST 2020}

二级缓存生效条件:
第一个sqlSession对象被提交或关闭;
两个查询操作之间存在增删改操作(因为增删改操作都会有默认清空一级、二级缓存的配置:flushCache:“true”);

猜你喜欢

转载自blog.csdn.net/qq_38152400/article/details/108347132