MyBatis源码-解读Executor的三个实现类之SimpleExecutor(简单执行器)
文章目錄
- Pre
- Executor 執(zhí)行器
- 接口繼承關(guān)系
- SimpleExecutor(簡(jiǎn)單執(zhí)行器)
- 入門(mén)小demo
- 實(shí)例化SimpleExecutor
- doQuery方法
Pre
MyBatis源碼-深入理解MyBatis Executor的設(shè)計(jì)思想
工程部分見(jiàn)
MyBatis源碼- SqlSession門(mén)面模式 & selectList 源碼解析
實(shí)際中,我們都是面向SqlSession編程的,不會(huì)直接調(diào)用Executor來(lái)執(zhí)行業(yè)務(wù)邏輯,這里我們僅僅是為了深入了解下Executor體系架構(gòu)才這么搞的,切記。
Executor 執(zhí)行器
接口繼承關(guān)系
這里我們重點(diǎn)看下Executor的 三個(gè)實(shí)現(xiàn)子類(lèi)。
分別是:SimpleExecutor(簡(jiǎn)單執(zhí)行器)、ReuseExecutor(重用執(zhí)行器)、BatchExecutor(批處理執(zhí)行器)。
SimpleExecutor(簡(jiǎn)單執(zhí)行器)
入門(mén)小demo
package com.artisan;import com.artisan.bean.User; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.executor.SimpleExecutor; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.session.RowBounds; import org.apache.ibatis.transaction.jdbc.JdbcTransaction; import org.junit.Test;import java.sql.SQLException; import java.util.List;/*** @author 小工匠* @version v1.0* @create 2020-06-14 16:36* @motto show me the code ,change the word* @blog https://artisan.blog.csdn.net/* @description**/public class ExecutorTest extends BaseTest {private MappedStatement ms;private JdbcTransaction jdbcTransaction;@Testpublic void test() throws SQLException {// 通過(guò)factory.openSession().getConnection()實(shí)例化JdbcTransaction ,用于構(gòu)建SimpleExecutorjdbcTransaction = new JdbcTransaction(factory.openSession().getConnection());// 映射SQLms = configuration.getMappedStatement("com.artisan.UserMapper.selectByid");// 實(shí)例化SimpleExecutorSimpleExecutor simpleExecutor = new SimpleExecutor(configuration, jdbcTransaction);// 調(diào)用doQuery執(zhí)行查詢(xún)List<User> userList = simpleExecutor.doQuery(ms, 1, RowBounds.DEFAULT, Executor.NO_RESULT_HANDLER, ms.getBoundSql(1));System.out.println(userList.get(0));}}有了整體的了解以后,我們拆分來(lái)看下SimpleExecutor是如何工作的
實(shí)例化SimpleExecutor
首先我們要實(shí)例化一個(gè)SimpleExecutor ,看下SimpleExecutor的源碼
兩個(gè)參數(shù)
public SimpleExecutor(Configuration configuration, Transaction transaction) {super(configuration, transaction);}使用JdbcTransaction 即可
jdbcTransaction = new JdbcTransaction(factory.openSession().getConnection());doQuery方法
實(shí)例化完成以后,執(zhí)行方法調(diào)用doQuery
@Overridepublic <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {.......}我們可以看到這個(gè)方法是 @Override 重寫(xiě)父類(lèi)的方法 ,去它的父類(lèi)BaseExecutor看下該方法
BaseExecutor##doQuery
protected abstract <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql)throws SQLException;抽象方法 泛型支持
我們知道MyBatis Executor 有3個(gè)子類(lèi),父類(lèi)中的抽象方法doQuery其實(shí)就是讓子類(lèi)去重寫(xiě),實(shí)現(xiàn)不同的功能。
SimpleExecutor 、ReuseExecutor 、BatchExecutor 都是繼承 BaseExecutor, 重寫(xiě)doQuery來(lái)實(shí)自身的特色功能 。
參數(shù)解讀
-
MappedStatement : 映射SQL
-
Object parameter : SQL中的動(dòng)態(tài)參數(shù)
-
RowBounds:分頁(yè)用的,默認(rèn)不分頁(yè) RowBounds.DEFAULT , 可參考 org.apache.ibatis.session.RowBounds
-
ResultHandler: 自定義處理返回結(jié)果 ,不使用寫(xiě) Executor.NO_RESULT_HANDLER
-
BoundSql : 綁定的SQL
入?yún)⒅v完了,我們來(lái)看下doQuery方法都做了些什么工作
@Overridepublic <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {Statement stmt = null;try {Configuration configuration = ms.getConfiguration();StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);stmt = prepareStatement(handler, ms.getStatementLog());return handler.query(stmt, resultHandler);} finally {closeStatement(stmt);}}我們看下執(zhí)行過(guò)程的日志輸出
17:50:42,538 DEBUG com.artisan.UserMapper.selectByid:143 - ==> Preparing: select * from users where id = ? 17:50:42,739 DEBUG com.artisan.UserMapper.selectByid:143 - ==> Parameters: 1(Integer) 17:50:42,808 DEBUG com.artisan.UserMapper.selectByid:143 - <== Total: 1 User{id=1, name='artisan', age='11', sex='male', emal='123@qq.com', phoneNumber='12345', createTime=Thu Jun 04 08:00:00 CST 2020}預(yù)編譯 —執(zhí)行SQL ----獲取返回結(jié)果
我們加上兩行代碼在執(zhí)行一遍
List<User> userList2 = simpleExecutor.doQuery(ms, 1, RowBounds.DEFAULT, Executor.NO_RESULT_HANDLER, ms.getBoundSql(1));System.out.println(userList2.get(0));可以發(fā)現(xiàn),相同的SQL 每次調(diào)用 都會(huì)預(yù)編譯 ,我們期望的結(jié)果是 相同的SQL只要編譯一次即可,那SimpleExecutor不支持,那怎么辦呢
Executor 的另外一個(gè)實(shí)現(xiàn)類(lèi) ReuseExecutor 支持該功能 。 下篇博文我們來(lái)瞅瞅ReuseExecutor
總結(jié)
以上是生活随笔為你收集整理的MyBatis源码-解读Executor的三个实现类之SimpleExecutor(简单执行器)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 设计模式 -结构型模式_门面模式(外观模
- 下一篇: JVM-白话聊一聊JVM类加载和双亲委派