1、MyBatis缓存介绍
现在我们每次执行相同的 SQL 语句都是去数据库中查询,存在效率问题。
MyBatis 框架提供了缓存策略,通过缓存策略可以减少查询数据库的次数,提升系统性能。
在 MyBatis 框架中缓存分为一级缓存和二级缓存,一般来说缓存在内存中。
1、Mybatis一级缓存
介绍:一级缓存是 sqlSession 范围的缓存,只能在同一个 sqlSession 内部有效。它本身已经存在,一级缓存不需要手动处理,可以直接使用。
代码示例:
// 测试一级缓存
public void test03() {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 第一次查询
User user = mapper.findUserById(1);
System.out.println(user.getUsername());
// 清除缓存
// sqlSession.clearCache();
// 第二次查询
User user2 = mapper.findUserById(1);
System.out.println(user2.getUsername());
sqlSession.close();
}输出结果:

注意事项:第一次查询数据时,会将查询的数据放入一级缓存中。后面的相同查询直接从缓存中获取。
一级缓存是 SqlSession 范围缓存。当调用 SqlSession 的修改、添加、删除、提交、关闭等方法时,一级缓存会被清空。
2、Mybatis二级缓存
介绍:二级缓存是 mapper 映射级别缓存,作用范围跨越 SqlSession,即可以在多个 SqlSession 之间共享二级缓存数据。
二级缓存关键点:
1. 实体类需要实现 Serializable 接口
2. 至少要准备 2 个 SqlSession,再进行测试
2.1、二级缓存实现步骤
1、修改实体类实现Serializable接口
public class User implements Serializable {
private Integer id; // 主键
private String username; // 用户名
private Date birthday; // 生日
private String sex; // 性别
private String address; // 地址
// 省略其他
}2、在 mybatis-config.xml 配置开启二级缓存

3、在 UserMapper.xml 开启二级缓存使用

2.1、测试代码
public void test04() {
// 第一个sqlSession
SqlSession sqlSession1 = MyBatisUtils.getSqlSession();
UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
User user1 = mapper1.findUserById(1);
System.out.println("第一次" + user1.getUsername());
sqlSession1.close(); // 要关闭数据才会保存二级缓存中
// 第二个sqlSession
SqlSession sqlSession2 = MyBatisUtils.getSqlSession();
UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
User user2 = mapper2.findUserById(1);
System.out.println("第二次" + user2.getUsername());
sqlSession2.close();
}运行结果:

评论