参考资料:Mybatis 官网
本文内容如下:
一、简答
- 一级缓存
- 二级缓存
- spring 整合 Mybatis 后的缓存
- 总结
二、代码验证缓存
- 1、验证一级缓存的存在
- 验证作用范围 STATEMENT
- 验证作用范围 SESSION
- 2、验证二级缓存的存在
- 3、Spring整合Mybatis 之后,一级缓存的验证
一、简答
Mybatis 的缓存有 一级缓存 和 二级缓存。
一级缓存
一级缓存在 Mybatis 中默认是开启并生效的。
一级缓存存在两种作用范围:
- SESSION(默认)
在同一个 SqlSession 中多次执行同一个查询,除第一次走数据库,剩下的都走缓存 - STATEMENT
每执行完一个 Mapper 中的语句后都会将一级缓存清除。
二级缓存
二级缓存在 Mybatis 中默认是不开启。准确的来讲应该是二级缓存的全局配置开关是默认开启的但是想要二级缓存生效,还需要进行配置。
二级缓存的作用范围是同一个 namespace 下的mapper 映射文件内容。多个 SqlSession 之间可以共享缓存内容。
spring 整合 Mybatis 后
Spring 整合 Mybatis 之后,二级缓存照常生效,但是一级缓存有了改变。如果不是在同一个事务中每一次 Mapper 方法的调用,都会生成一个新的 Sqlsession,这时候一级缓存就不会命中。
总结
默认情况下,相关信息如下:
作用域 | 默认是否开启 | |
---|---|---|
一级缓存 | SESSION(默认) 和 STATEMENT | 开启 |
二级缓存 | 同一个namespace下的mapper映射文件内容 | 关闭 |
二、代码实践
验证一级缓存的存在
验证作用范围 STATEMENT
当 一级缓存 的作用域改为 STATEMENT 时,每执行一次 Mapper 中的语句后会将一级缓存清除。
此时一级缓存相当于摆设。
step1、设置一级缓存作用范围为 STATEMENT(mybatis-config.xml中)
<settings>
<!-- 调整一级缓存作用域为 STATEMENT -->
<setting name="localCacheScope" value="STATEMENT"/>
</settings>
step2、相关代码
/**
* <p> Mybatis 缓存验证测试 </p>
*
* @Author WTF名字好难取
*/
public class DemoTestFromXML {
public static SqlSession getSqlSession() throws FileNotFoundException {
//配置文件
InputStream configFile = new FileInputStream("xxx.mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configFile);
//加载配置文件得到SqlSessionFactory
return sqlSessionFactory.openSession();
}
public static void main(String[] args) throws Exception {
// 一级缓存:STATMENT 验证
oneLeveCacheVerifySTATEMENT();
}
/**
* <p> 一级缓存:STATMENT验证 </p>
*
* @throws Exception
*/
public static void oneLeveCacheVerifySTATEMENT() throws Exception{
UserInfoMapper mapper = getSqlSession().getMapper(UserInfoMapper.class);
// 第一次查询
List<UserInfo> userInfos1 = mapper.selectList()