初识Mybatis之Executor执行器(一)
一、前言:
mybatis框架有四大步骤,分别为接口代理、门面会话、执行器、jdbc处理器,本文将针对执行器进行展开.
二、执行器
-
执行器关系图
Executor是执行器接口,BaseExecutor是一个抽象类,负责管理mybatis的一级缓存(会话级缓存)逻辑,BaseExecutor的子类有SimpleExecutor(简单执行器)、ReuseExecutor(可重用执行器)、BatchExecutor(批处理执行器),还有CachingExecutor,继承Executor,主要负责mybatis的二级缓存(应用级缓存).
-
Executor
Executor是mybatis中的执行器接口
-
BaseExecutor
基础执行器,主要职责mybatis的一级缓存(会话级缓存),增、删、改都会清空一级缓存,下面看一下BaseExecutor的基本成员变量.
-
SimpleExecutor
简单执行器,每次都会创建一个StatementHandler(Statement处理器)进行查询.
-
ReuseExecutor
可重用执行器,内部会创建一个statementMap,用来缓存每次执行的sql语句创建的statement,从而达到复用.
-
BatchExecutor
批处理执行器,每次增、删、该操作会将sql语句创建的statement缓存到内部的statementList中,调用doFlushStatements才是真正对sql进行执行,将结果数据缓存到内部的batchResultList中,最终才能获取到执行结果
-
CachingExecutor
缓存执行器,主要职责mybatis的二级缓存(应用级缓存),包装Executor执行器,通过TransactionalCacheManager(事务缓存管理器)对当前的Executor进行二级缓存逻辑处理.
三、存在BaseExecutor,为什么还要设计SimpleExecutor、ReuseExecutor、BatchExecutor?
mybatis的Executor体系思想为单一职责,如果将SimpleExecutor、ReuseExecutor、BatchExecutor放入其中,不由思索,BaseExecutor量太大,所做事情形同一个人做几个人的事情,所以这种单一职责设计是不是可以灵活运用,解决代码堆积在一个类的问题.
四、总结
通过上面的了解,我们已经初步认识到mybatis中的Executor各大执行器,其中单一职责设计不由感到妙啊!细心的小伙伴已经发现了CachingExecutor中的delegate, 不知名会发现这是啥,其实这是装饰了Executor,没错这就是装饰器模式.
切记BaseExecutor的一级缓存是会话级别的哟,增、删、改都会清空一级缓存,CachingExecutor的二级缓存是应用级的.