Mybatis一级缓存(默认开启)
- 是SqlSession级别的缓存
- 默认开启
一级缓存清除方法
- 执行SqlSession的commit(执行插入、更新、删除操作后)
- 执行SqlSession的close方法
- 执行SqlSession的clearCache方法
- 映射文件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开发方式的配置步骤:
-
配置mybatis核心配置文件
<settings> <!--因为cacheEnabled的取值默认就为true,所以这一步可以省略不配置。 为true代表开启二级缓存;为false代表不开启二级缓存。--> <setting name="cacheEnabled" value="true"/> </settings>
-
配置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>
-
修改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; }
-
测试结果
@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(); }
二级缓存注解开发方式的配置步骤:
-
配置mybatis核心配置文件
<settings> <!--因为cacheEnabled的取值默认就为true,所以这一步可以省略不配置。 为true代表开启二级缓存;为false代表不开启二级缓存。--> <setting name="cacheEnabled" value="true"/> </settings>
-
配置Mapper接口,添加注解
@CacheNamespace public interface UserMapper {...}
-
测试结果
/** * 注解方式二级缓存测试 */ @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调试图