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();
}

运行结果: