mybatis一级缓存,二级缓存的开启、关闭、清除及使用说明

Mybatis一级缓存(默认开启)

  • 是SqlSession级别的缓存
  • 默认开启

一级缓存清除方法

  1. 执行SqlSession的commit(执行插入、更新、删除操作后)
  2. 执行SqlSession的close方法
  3. 执行SqlSession的clearCache方法
  4. 映射文件XML中添加flushCache=“true”
    <select flushCache="true"></select>

Mybatis二级缓存(默认关闭,一般不建议使用)

  • namspace/mapper级别(跨sqlSession)的缓存
  • 默认不开启
  • 二级缓存的开启需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的,也就是要求实现Serializable接口。配置方法很简单,只需要在映射XML文件配置 <cache></cache> 就可以开启 二级缓存了
  • 二级缓存因为是跨sqlSession的,会存在严重的脏读问题 (脏读问题解释
  • 二级缓存的弊大于利,一般是设置为关闭二级缓存
  • 实际开发中,会使用第三方来缓存,比如redis

二级缓存清除方法

映射文件XML中添加flushCache=“true”
<select flushCache="true"></select>

二级缓存XML开发方式的配置步骤:

  1. 配置mybatis核心配置文件

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

    <mapper namespace="com.lagou.dao.UserMapper">
    <!--当前映射文件开启二级缓存-->
    <cache></cache>
    <!--
    <select>标签中设置useCache=”true”代表当前这个statement要使用二级缓存。如果不使用二级缓存可以设置为false
    注意:
    如果每次查询都需要最新的数据sql,要设置成useCache="false",禁用二级缓存。
    -->
    <select id="findById" parameterType="int" resultType="user" useCache="true"
    >
    SELECT * FROM `user` where id = #{id}
    </select>
    </mapper>
    
  3. 修改User实体,实现Serializable接口

    public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    private List<Role> roleList;
    private List<Order> orderList;
    }
    
  4. 测试结果

    @Test
        public void TwoCacheTest() throws IOException {
            InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    
            SqlSession sqlSession1 = sqlSessionFactory.openSession();
            UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
            User user = mapper1.findUserById(1);
            System.out.println(user);
            //只有执行sqlSession.commit或sqlSession.close方法,一级缓存中的内容才会刷新到二级缓存中
            sqlSession1.close();
    
            SqlSession sqlSession2 = sqlSessionFactory.openSession();
            UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
            User user2 = mapper2.findUserById(1);
            System.out.println(user2);
    
            sqlSession2.close();
        }
    

二级缓存注解开发方式的配置步骤:

  1. 配置mybatis核心配置文件

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

    @CacheNamespace
    public interface UserMapper {...}
    
  3. 测试结果

    	/**
         * 注解方式二级缓存测试
         */
        @Test
        public void twoCacheTest() throws IOException {
            InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
            
            SqlSession sqlSession1 = sqlSessionFactory.openSession();
            UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
    
            SqlSession sqlSession2 = sqlSessionFactory.openSession();
            UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
            
            //查询的时候,先去二级缓存查,二级缓存没有,会查询一级缓存,一级缓存也没有,会查询数据库
            User user1 = mapper1.findById(1);
            //查询结果存入缓存时,先存入一级缓存,再存入二级缓存,只有执行sqlSession.commit或close方法,才能将一级缓存内容刷新到二级缓存中
            sqlSession1.close();
            System.out.println(user1);
    
            User user2 = mapper2.findById(1);
            sqlSession2.close();
            System.out.println(user2);
    
        }
    

debug调试图
在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迟到_啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值