文末附有源码地址
介绍:博客为代码完成后才开始整理,展示的代码都是最终代码
个人学习,代码写的不够好,有点乱
通过学习mybatis源码模拟实现Mybatis(在完善)
已实现:
crud(实现XML配置,注解配置写过一点,原理差不多不写了)、
事务、
数据库连接池、
动态sql(一部分,原理没问题了,以后有时间再完善)、
一级二级缓存
mybatis缓存分为一级、二级缓存。一级缓存就是 SqlSession 级别的缓存,而同一个 SqlSession 会有相同的一级缓存。
通过探究得到以下流程:
Salsession -> Defaultsqlsession -> Executor -> baseexecutor -> Perpetualcache
我们每次执行 update 方法时,都会先刷新一级缓存,因为是同一个 SqlSession, 所以是由同一个 Map 进行存储的,所以此时一级缓存会失效
前面的类我们已经写过,那最重要的是Perpetualcache,mybatis定义了一个Cache接口并让Perpetualcache实现这个接口。
public class PerpetualCache implements Cache {
private final Map
其中属性map类型的cache便存放的是缓存数据。
缓存在Executor被使用
Listcache = (List ) localCache.getObject(resultSql); if (cache != null) { return cache; } localCache.putObject(resultSql, list); if (configuration.isEnableCache()) { configuration.getPerpetualCache().putObject(resultSql, list); }
同一个sqlsession每次update都要清空缓存。
public int update(Mapper mapper, Object[] object) {
localCache.clear();
if (configuration.isEnableCache()) {
configuration.clearPerpetualCache();
}
}
三、mybatis二级缓存
mybatis二级缓存默认是不开启的,若要使用需手动开启。
mybatis有一个CachingExecutor ,在执行一级缓存之前先进行二级缓存的查询。二级缓存被多个sqlsession所共享。同一个命名空间(namespace) 语句,都影响着一个共同的 cache.
update操作会清除缓存,个人感觉二级缓存作用其实不大。
大致模仿实现略微和mybatis不同:
if (configuration.isEnableCache()) {
List globalCache = (List) configuration.getPerpetualCache().getObject(resultSql);
if (globalCache != null) {
return globalCache;
}
}
...........
...........
if (configuration.isEnableCache()) {
configuration.getPerpetualCache().putObject(resultSql, list);
}
学习参考
项目地址github:https://github.com/Alice-175/Mybaits
gitee:https://gitee.com/alice-175/Mybaits



