手写MyBatis ORM框架(十)

手写MyBatis ORM框架(十)

引言

在这篇文章,我们会实现MyBatis的一级缓存。

开始

介绍

MyBatis 的一级缓存(SqlSession 级别缓存)通过 缓存键生成、缓存存储 和 缓存失效机制 实现,核心逻辑在 BaseExecutor 中完成。

配置解析入口与缓存开关

  核心入口点:

  1.     XMLConfigBuilder 作为配置解析入口,负责解析 mybatis-config.xml 中 标签下的缓存相关配置

  1.     关键配置项:LocalCacheScope

    <settings> <setting name="localCacheScope" value="STATEMENT"/> </settings>

  MyBatis 一级缓存是 SqlSession 级别 的缓存,默认开启且无法关闭。其核心目标是减少相同查询对数据库的重复访问,通过以下机制实现:

  1. 缓存范围:同一个 SqlSession 内的多次相同查询共享缓存。

  2. 自动失效:执行 INSERT/UPDATE/DELETE 或调用 commit()/rollback() 时自动清空缓存。

  3. 数据结构:基于 HashMap 实现,键为 唯一查询标识(CacheKey),值为查询结果。

定义缓存接口

缓存接口主要提供了数据的存放、获取、删除、情况,以及数量大小的获取。

  • 一级缓存的实现类也叫永远缓存,使用 HashMap 存放数据,因为这个缓存是配合整个会话周期内使用和销毁,所以使用 HashMap 也比较简单,不需要太多的容量和大小限制。

创建CacheKey

在 MyBatis 中,CacheKey(缓存键) 是用于唯一标识一个查询请求的“指纹”,其核心作用是 确保不同查询条件生成的缓存键不同,避免缓存覆盖或错误命中。它是 MyBatis 一级缓存和二级缓存实现中 去重与隔离 的技术基础。

在BaseExecutor添加查询缓存操作

public abstract class BaseExecutor implements Executor {
    protected PerpetualCache localCache; // 一级缓存实例
    // ...
}

在query与update 方法中进行修改。

一级缓存的使用与清除

LICENSED UNDER CC BY-NC-SA 4.0