Mybatis缓存
2020-04-17 本文已影响0人
小杨小杨神采飞杨
缓存对select语句生效,不经常修改,需要经常查询的数据可以使用缓存提升速度,反之则不建议使用,mybatis默认使用一级缓存,可设置二级或自定义二级缓存
一级缓存
默认开启,SqlSession级别,连接关闭后就清空缓存

注意:当进行增删改操作之后,即使增删改的不是查询过的信息,依旧会重新缓存数据

也可以主动清理缓存
sqlSession.clearCache(); //清除之前操作产生的缓存
二级缓存
需要设置,namespace级别,使用二级缓存若不设置只读,则需要让实体类可以序列化,即实现序列化接口

二级缓存在mapper.xml中开启就可以使用,但是还是建议在pom.xml中显式定义开启全局缓存,提高程序可读性
<!--显式开启全局缓存-->
<setting name="cacheEnabled" value="true"/>
在mapper.xml中使用标签<cache/>即可开启二级缓存,之后将需要使用二级缓存的sql标签的useCache属性设为true即可

二级缓存是在一级缓存关闭之后将数据传递给二级缓存,所以当创建一级缓存的sqlSession未关闭,则二级缓存中不会有对应的缓存数据
@Test
public void testFind() {
SqlSession sqlSession = mybatisUtil.getSqlSession();
SqlSession sqlSession2 = mybatisUtil.getSqlSession();
userMapper mapper = sqlSession.getMapper(userMapper.class);
userMapper mapper2 = sqlSession2.getMapper(userMapper.class);
user userById = mapper.findUserById(95001);
System.out.println(userById);
sqlSession.close(); //关闭第一次连接 == 关闭一级缓存
//mapper.updateUser(new user(95002,"周杰伦","88888888"));
//sqlSession.clearCache();
System.out.println("==================================================================");
user userById2 = mapper2.findUserById(95001);
System.out.println(userById2);
System.out.println(userById == userById2);
sqlSession2.close();
}

自定义缓存
可以自定义或引入第三方缓存,目前用redis较多