Ref: https://pdai.tech/md/framework/orm-mybatis/mybatis-y-cache-level2.html
MyBatis 二级缓存实现
MyBatis 的二级缓存是 Application 级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。
MyBatis 的缓存机制整体设计以及二级缓存的工作模式

如图所示,当开一个会话时,一个 SqlSession 对象会使用一个 Executor 对象来完成会话操作,MyBatis 的二级缓存机制的关键就是对这个 Executor 对象做文章。如果用户配置了 “cacheEnabled=true”,那么 MyBatis 在为 SqlSession 对象创建 Executor 对象时,会对 Executor 对象加上一个装饰者:CachingExecutor,这时 SqlSession 使用 CachingExecutor 对象来完成操作请求。CachingExecutor 对于查询请求,会先判断该查询请求在 Application 级别的二级缓存中是否有缓存结果,如果有查询结果,则直接返回缓存结果;如果缓存中没有,再交给真正的 Executor 对象来完成查询操作,之后 CachingExecutor 会将真正 Executor 返回的查询结果放置到缓存中,然后再返回给用户。

CachingExecutor 是 Executor 的装饰者,以增强 Executor 的功能,使其具有缓存查询的功能,这里用到了设计模式中的装饰者模式,CachingExecutor 和 Executor 的接口的关系如下类图所示:
MyBatis 二级缓存的划分
MyBatis 并不是简单地对整个 Application 就只有一个 Cache 缓存对象,它将缓存划分的更细,即是 Mapper 级别的,即每一个 Mapper 都可以拥有一个 Cache 对象,具体如下:

- 为每一个 Mapper 分配一个 Cache 缓存对象(使用 节点配置)
MyBatis 将 Application 级别的二级缓存细分到 Mapper 级别,即对于每一个 Mapper.xml, 如果在其中使用了 节点,则 MyBatis 会为这个 Mapper 创建一个 Cache 缓存对象,如下图所示:
注:上述的每一个 Cache 对象,都会有一个自己所属的 namespace 命名空间,并且会将 Mapper 的 namespace 作为它们的 ID;
- 多个 Mapper 共用一个 Cache 缓存对象(使用 节点配置)
如果你想让多个 Mapper 公用一个 Cache 的话,你可以使用 节点,来指定你的这个 Mapper 使用到了哪一个 Mapper 的 Cache 缓存。
使用二级缓存,必须要具备的条件
MyBatis 对二级缓存的支持粒度很细,它会指定某一条查询语句是否使用二级缓存。
虽然在 Mapper 中配置了 , 并且为此 Mapper 分配了 Cache 对象,这并不表示我们使用 Mapper 中定义的查询语句查到的结果都会放置到 Cache 对象之中,我们必须指定 Mapper 中的某条选择语句是否支持缓存,即如下所示,在