读mybatis源码之六:执行器Executor之基类BaseExecutor
来源:互联网 发布:会计证软件题库手机 编辑:程序博客网 时间:2024/04/29 07:54
在sqlsession中主要是执行都是通过executor来处理的,具体执行逻辑,大部分在BaseExecutor里面,使用的模板模式,
一、query:
public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException { BoundSql boundSql = ms.getBoundSql(parameter); CacheKey key = createCacheKey(ms, parameter, rowBounds, boundSql); return query(ms, parameter, rowBounds, resultHandler, key, boundSql); }
BoundSql :sql语句,参数等
CacheKey :缓存key,通过mapperID,sql、参数等产生缓存key
@SuppressWarnings("unchecked") public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException { ErrorContext.instance().resource(ms.getResource()).activity("executing a query").object(ms.getId()); if (closed) throw new ExecutorException("Executor was closed."); if (queryStack == 0 && ms.isFlushCacheRequired()) { clearLocalCache(); } List<E> list; try { queryStack++; list = resultHandler == null ? (List<E>) localCache.getObject(key) : null; if (list != null) { handleLocallyCachedOutputParameters(ms, key, parameter, boundSql); } else { list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql); } } finally { queryStack--; } if (queryStack == 0) { for (DeferredLoad deferredLoad : deferredLoads) { deferredLoad.load(); } deferredLoads.clear(); // issue #601 if (configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT) { clearLocalCache(); // issue #482 } } return list; }
可以看见:
1、先查本地缓存,没有再去查数据库,注意这里的本地缓存是同一个session内的缓存,也就是同一个opensession内。
2、通过configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT来看,可以设置参数,将本地缓存去掉,不使用本地缓存。
private <E> List<E> queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException { List<E> list; localCache.putObject(key, EXECUTION_PLACEHOLDER); try { list = doQuery(ms, parameter, rowBounds, resultHandler, boundSql); } finally { localCache.removeObject(key); } localCache.putObject(key, list); if (ms.getStatementType() == StatementType.CALLABLE) { localOutputParameterCache.putObject(key, parameter); } return list; }
本地缓存先占位,后更新。
使用不同的执行器去做查询动作,具体的doQuery由不同的执行去具体实现
二、update
public int update(MappedStatement ms, Object parameter) throws SQLException { ErrorContext.instance().resource(ms.getResource()).activity("executing an update").object(ms.getId()); if (closed) throw new ExecutorException("Executor was closed."); clearLocalCache(); return doUpdate(ms, parameter); }
清除本地缓存,做更新操作,具体更新操作在具体执行器中。
各大执行器主要需要写自己的:
protected abstract int doUpdate(MappedStatement ms, Object parameter) throws SQLException; protected abstract List<BatchResult> doFlushStatements(boolean isRollback) throws SQLException; protected abstract <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException;
0 0
- 读mybatis源码之六:执行器Executor之基类BaseExecutor
- myBatis源码之Executor、BaseExecutor和CachingExecutor
- 读mybatis源码之五:执行器Executor创建
- 跟我一起读postgresql源码(六)——Executor(查询执行模块之——查询执行策略)
- Mybatis执行BaseExecutor(二)
- Mybatis 之 Executor
- 读mybatis源码之七:执行器Exceutor之四大执行器
- Mybatis源码分析之执行完整分析
- Java多线程 之 执行器Executor(二)
- 读mybatis源码之四:执行逻辑之二mapper执行
- Spark源码分析之Executor分析
- 读mybatis源码之三:执行逻辑之一SqlSession直接执行
- 读mybatis源码之十三:拦截器
- Mybatis执行Executor(一)
- Mybatis源码之Statement处理器CallableStatementHandler(六)
- 读mybatis源码之十四:mybatis事务处理
- Pyunit源码笔记之六 testcase run的执行前奏
- Mybatis源码之执行数据库脚本工具阅读
- 矩阵快速幂模板篇
- hdu 4366
- F
- 程序员生存定律--管理向左,技术向右
- 更改火狐浏览器缓存路径
- 读mybatis源码之六:执行器Executor之基类BaseExecutor
- 探索Linux下面如何阅读代码
- 重载Object equals方法
- VC编程增加快捷键的几种方式
- ZOJ-1098
- c中常见的矩形问题的解题思路与方法
- 编译原理 词法分析器
- 图书管理系统
- gstreamer文档part-negotiation.txt翻译