mybatis源碼閱讀-執行器Executor(四)
阿新 • • 發佈:2019-04-09
沒有 closed .com handle nal dstat 技術分享 see owb
說明
前面二看到了 sqlSession最終是找到MapperStatement然後委托給Executer執行的 Executer到底做了什麽
接口定義
public interface Executor { ResultHandler NO_RESULT_HANDLER = null; int update(MappedStatement var1, Object var2) throws SQLException; <E> List<E> query(MappedStatement var1, Object var2, RowBounds var3, ResultHandler var4, CacheKey var5, BoundSql var6) throwsSQLException; <E> List<E> query(MappedStatement var1, Object var2, RowBounds var3, ResultHandler var4) throws SQLException; <E> Cursor<E> queryCursor(MappedStatement var1, Object var2, RowBounds var3) throws SQLException; List<BatchResult> flushStatements() throwsSQLException; void commit(boolean var1) throws SQLException; void rollback(boolean var1) throws SQLException; CacheKey createCacheKey(MappedStatement var1, Object var2, RowBounds var3, BoundSql var4); boolean isCached(MappedStatement var1, CacheKey var2); void clearLocalCache();void deferLoad(MappedStatement var1, MetaObject var2, String var3, CacheKey var4, Class<?> var5); Transaction getTransaction(); void close(boolean var1); boolean isClosed(); void setExecutorWrapper(Executor var1); }
類圖
Executor各個實現
ClosedExecutor
org.apache.ibatis.executor.loader.ResultLoaderMap 中的一個內部靜態類
private static final class ClosedExecutor extends BaseExecutor { public ClosedExecutor() { super((Configuration)null, (Transaction)null); } public boolean isClosed() { return true; } protected int doUpdate(MappedStatement ms, Object parameter) throws SQLException { throw new UnsupportedOperationException("Not supported."); } protected List<BatchResult> doFlushStatements(boolean isRollback) throws SQLException { throw new UnsupportedOperationException("Not supported."); } protected <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { throw new UnsupportedOperationException("Not supported."); } protected <E> Cursor<E> doQueryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds, BoundSql boundSql) throws SQLException { throw new UnsupportedOperationException("Not supported."); } }
沒有具體實現 我們不會用到
SimpleExecutor
每執行一次update或select,就開啟一個Statement對象,用完立刻關閉Statement對象。(可以是Statement或PrepareStatement對象)
public class SimpleExecutor extends BaseExecutor { public int doUpdate(MappedStatement ms, Object parameter) throws SQLException { Statement stmt = null; int var6; try { //獲得configuration Configuration configuration = ms.getConfiguration(); //根據configuration獲得對應的StatementHandler 後面講 StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, (ResultHandler) null, (BoundSql) null); stmt = this.prepareStatement(handler, ms.getStatementLog()); var6 = handler.update(stmt); } finally { //釋放Statement this.closeStatement(stmt); } return var6; } private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException { Connection connection = this.getConnection(statementLog); Statement stmt = handler.prepare(connection, this.transaction.getTimeout()); handler.parameterize(stmt); return stmt; } }
可以看到finally會關閉Statement
mybatis源碼閱讀-執行器Executor(四)