概述
MyBatis 是一个支持自定义 SQL、存储过程和高级映射的持久层框架,它提供了多种缓存机制来提升查询性能。在 MyBatis 中,缓存分为一级缓存(Local Cache)和二级缓存(Second Level Cache),同时还支持用户自定义缓存实现。
一级缓存(Local Cache)
一级缓存是 MyBatis 默认开启的缓存,它的作用域是 SqlSession 级别的。具体特点如下:
- 作用范围:在同一个 SqlSession 内部,多次相同的查询会直接从缓存中获取结果,避免重复查询数据库,提高性能。
- 生命周期:与 SqlSession 相关联,当 SqlSession 关闭时,一级缓存也会被清空。
- 清空机制:任何一次增删改操作(insert、update、delete)都会导致一级缓存被清空,保证缓存数据的一致性。
一级缓存是 MyBatis 默认开启的,一般情况下无需特别配置。
二级缓存(Second Level Cache)
二级缓存是全局共享的缓存机制,可以跨 SqlSession 使用,它的作用范围是 Mapper 级别的。主要特点包括:
- 作用范围:可以被多个 SqlSession 共享,同一个 namespace 下的多个 SqlSession 可以共享二级缓存中的数据。
- 生命周期:与整个 namespace 相关联,当多个 SqlSession 执行相同的查询时,第一个 SqlSession 查询并将结果存入二级缓存,后续的 SqlSession 直接从缓存中获取。
- 清空机制:由于是跨 SqlSession 共享的,增删改操作会引起该 namespace 下所有缓存数据的失效,但不会直接清空缓存,而是使缓存失效。
配置二级缓存
配置二级缓存需要在 MyBatis 的 XML 配置文件中进行:
<!-- 在每个 Mapper 的配置中开启二级缓存 -->
<mapper namespace="com.example.mapper.UserMapper">
<cache type="org.apache.ibatis.cache.impl.PerpetualCache"/>
<!-- 其他 Mapper 配置 -->
</mapper>
<!-- 在全局配置中开启二级缓存 -->
<settings>
<setting name="cacheEnabled" value="true"/>
<!-- 其他全局配置 -->
</settings>
自定义缓存
除了 MyBatis 提供的默认缓存实现外,你还可以自定义实现自己的缓存。自定义缓存需要实现 org.apache.ibatis.cache.Cache
接口,并注册到 MyBatis 的配置中。
自定义缓存的步骤如下:
-
实现 Cache 接口:实现自定义的缓存逻辑,需要实现以下方法:
String getId()
: 获取缓存实例的唯一标识符。void putObject(Object key, Object value)
: 将键值对存入缓存。Object getObject(Object key)
: 根据键获取缓存中的值。Object removeObject(Object key)
: 移除指定键对应的缓存项。void clear()
: 清空缓存。int getSize()
: 获取缓存中存储的项数。
-
配置缓存:将自定义的缓存类注册到 MyBatis 的配置中,可以在 XML 配置文件中指定或通过 Java 代码配置。
示例代码如下:
import org.apache.ibatis.cache.Cache;
public class MyCustomCache implements Cache {
private String id;
public MyCustomCache(String id) {
this.id = id;
}
@Override
public String getId() {
return this.id;
}
@Override
public void putObject(Object key, Object value) {
// 自定义缓存逻辑
}
@Override
public Object getObject(Object key) {
// 自定义缓存逻辑
return null;
}
@Override
public Object removeObject(Object key) {
// 自定义缓存逻辑
return null;
}
@Override
public void clear() {
// 自定义缓存逻辑
}
@Override
public int getSize() {
// 自定义缓存逻辑
return 0;
}
}
注册自定义缓存到 MyBatis 配置中的方法取决于你是使用 XML 还是 Java 代码进行配置。