引言
在这篇文章,我们会实现MyBatis的一级缓存。
开始
介绍
MyBatis 的一级缓存(SqlSession 级别缓存)通过 缓存键生成、缓存存储 和 缓存失效机制 实现,核心逻辑在 BaseExecutor 中完成。
配置解析入口与缓存开关
核心入口点:
XMLConfigBuilder 作为配置解析入口,负责解析 mybatis-config.xml 中 标签下的缓存相关配置
关键配置项:LocalCacheScope
<settings> <setting name="localCacheScope" value="STATEMENT"/> </settings>
MyBatis 一级缓存是 SqlSession 级别 的缓存,默认开启且无法关闭。其核心目标是减少相同查询对数据库的重复访问,通过以下机制实现:
缓存范围:同一个 SqlSession 内的多次相同查询共享缓存。
自动失效:执行 INSERT/UPDATE/DELETE 或调用 commit()/rollback() 时自动清空缓存。
数据结构:基于 HashMap 实现,键为 唯一查询标识(CacheKey),值为查询结果。
定义缓存接口
缓存接口主要提供了数据的存放、获取、删除、情况,以及数量大小的获取。
一级缓存的实现类也叫永远缓存,使用 HashMap 存放数据,因为这个缓存是配合整个会话周期内使用和销毁,所以使用 HashMap 也比较简单,不需要太多的容量和大小限制。
创建CacheKey
在 MyBatis 中,CacheKey(缓存键) 是用于唯一标识一个查询请求的“指纹”,其核心作用是 确保不同查询条件生成的缓存键不同,避免缓存覆盖或错误命中。它是 MyBatis 一级缓存和二级缓存实现中 去重与隔离 的技术基础。
在BaseExecutor添加查询缓存操作
public abstract class BaseExecutor implements Executor {
protected PerpetualCache localCache; // 一级缓存实例
// ...
}
在query与update 方法中进行修改。