聊聊Mybatis的Executor之模板方法模式
模板方法模式通过模板方法来指定流程,具体的子类来实现具体的逻辑。
我们看一下Executor接口,它的实现类有BaseExecutor抽象类和CachingExecutor类
BaseExecutor
BaseExecutor抽象类作为模板方法的抽象模板类,它把缓存和事务进行实现,具体变化的对数据库操作的部分由子类去实现
提交事务方法
我们先说说事务管理的commit()方法的实现:
@Override
public void commit(boolean required) throws SQLException {
if (closed) {
throw new ExecutorException("Cannot commit, transaction is already closed");
}
clearLocalCache();
flushStatements();
if (required) {
transaction.commit();
}
}
清除一级缓存
调用flushStatements()方法,这个方法中调用doFlushStatements抽象方法,具体操作由子类来实现,主要功能就是清除Statement对象
最后提交事务
回滚事务的逻辑和这个提交逻辑基本一致,就不再分析了
Mybatis默认开启一级缓存,是SqlSession级别的,即通过SqlSession建立会话,如果在这个会话中执行相同的sql,第一次执行的结果会进行缓存,再往后从缓存中查找
缓存数据
我们从它的query()方法来进行分析: