# MyBatis教程 - 12 缓存
什么是缓存?
就是 MyBatis 查询出数据,会将数据进行缓存,这样再次执行相同的查询,就直接获取缓存的数据,不用再去数据库中查询,如果缓存中没有,再去数据库中查询,减少数据库查询次数,从而提高查询效率。
在 MyBatis 中,缓存分为一级缓存和二级缓存 :
- 一级缓存:一级缓存是 SqlSession 级别的缓存,也就是说,在同一个 SqlSession 期间,如果执行相同的查询,MyBatis 会优先从缓存中获取数据,而不会再次访问数据库。一级缓存默认是开启的。
- 二级缓存:二级缓存是 SqlSessionFactory 级别的缓存。多个 SqlSession 共享二级缓存,缓存的数据可以被不同的 SqlSession 访问。二级缓存默认是关闭的,需要在 Mapper 文件或全局配置文件中显式开启。
# 12.1 一级缓存
# 1 测试一级缓存
一级缓存默认开启,我们直接测试一下查询用户即可。
@Test
public void testSelectUserById() {
// 获取SqlSession连接
SqlSession sqlSession = MyBatisUtils.getSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Integer id = 1;
// 查询用户列表
User user1 = userMapper.selectById(id);
log.info("user1: {}", user1);
User user2 = userMapper.selectById(id);
log.info("user2: {}", user2);
// 关闭SqlSession
sqlSession.close();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
上面的代码,执行了 2 次 userMapper.selectById
查询了两次用户。但是查看日志,发下只执行了一次 sql 。
执行如下:
同样,获取使用 SqlSession
获取两次 Mapper,执行查询,也是只有一条 sql,因为都是使用同一个 SqlSession
,如下:
内容未完......