SqlSession中四大神器

第4章 SqlSession中四大神器之Executor(執(zhí)行器)
4.1 Executor簡介
每一個(gè)SqlSession對(duì)象都會(huì)擁有一個(gè)Executor(執(zhí)行器對(duì)象);這個(gè)執(zhí)行對(duì)象負(fù)責(zé)[增刪改查]的具體操作.我們可以簡單的將它理解為JDBC中Statement的封裝版.

4.2 Executor繼承結(jié)構(gòu)


image.png

Executor是一個(gè)接口;主要有兩個(gè)實(shí)現(xiàn)類.分別是[BaseExecutor]和[CachingExecutor].

[BaseExecutor]是一個(gè)抽象類.這種通過抽象類實(shí)現(xiàn)接口的方式是[適配器設(shè)計(jì)模式]的體現(xiàn).
主要用于方便次一級(jí)子類對(duì)接口中方法的實(shí)現(xiàn).

[BaseExecutor]主要有三個(gè)實(shí)現(xiàn)類[SimpleExecutor],[ ReuseExecutor],[ BatchExecutor]

[SimpleExecutor]被稱為[簡單執(zhí)行器],是MyBatis中默認(rèn)使用的執(zhí)行器. 每執(zhí)行一次update或select,就開啟一個(gè)Statement對(duì)象,用完立刻關(guān)閉Statement對(duì)象。(可以是Statement或PrepareStatement對(duì)象)

[ ReuseExecutor]被稱為[可重用執(zhí)行器].這里的重用指的是重復(fù)使用Statement. 它會(huì)在內(nèi)部利用一個(gè)Map把創(chuàng)建的Statement都緩存起來,每次在執(zhí)行一條SQL語句時(shí),它都會(huì)去判斷之前是否存在基于該SQL緩存的Statement對(duì)象,存在而且之前緩存的Statement對(duì)象對(duì)應(yīng)的Connection還沒有關(guān)閉的時(shí)候就繼續(xù)用之前的Statement對(duì)象,否則將創(chuàng)建一個(gè)新的Statement對(duì)象,并將其緩存起來。因?yàn)槊恳粋€(gè)新的SqlSession都有一個(gè)新的Executor對(duì)象,所以我們緩存在ReuseExecutor上的Statement的作用域是同一個(gè)SqlSession

[ BatchExecutor]稱為[批處理執(zhí)行器].用于將多個(gè)sql語句一次性輸送到數(shù)據(jù)庫執(zhí)行.

[CachingExecutor]稱為[緩存執(zhí)行器]. 先從緩存中獲取查詢結(jié)果,存在就返回,不存在,再委托給Executor delegate去數(shù)據(jù)庫取,delegate可以是上面任一的SimpleExecutor、ReuseExecutor、BatchExecutor。代碼如下:

4.3 Excecutor對(duì)象創(chuàng)建
執(zhí)行器對(duì)象是由Coniguration對(duì)象負(fù)責(zé)創(chuàng)建的.Configuration對(duì)象會(huì)根據(jù)得到[ExecutorType]創(chuàng)建對(duì)應(yīng)的Excecutor對(duì)象,并把這個(gè)Excecutor對(duì)象傳給SqlSession對(duì)象


image.png

4.4 ExcecutorType的選擇.
ExecutorType來決定Configuration對(duì)象創(chuàng)建何種類型的執(zhí)行器.它的賦值可以通過兩個(gè)地方進(jìn)行賦值.
首先.可以通過<settings>標(biāo)簽來設(shè)置當(dāng)前工程中所有SqlSession對(duì)象使用的默認(rèn)Executour


image.png

也可以通過SqlSessoinFactory中openSession方法來指定具體的SqlSession使用的執(zhí)行器


image.png

第5章 SqlSession中四大神器之StatementHandler
5.1 StatementHandler簡介
是四大神器中最重要的一個(gè)對(duì)象,負(fù)責(zé)操作Statement與數(shù)據(jù)庫進(jìn)行交流.在工作時(shí)
還會(huì)使用ParameterHandler進(jìn)行參數(shù)配置,使用ResultHandler將查詢結(jié)果與實(shí)體類對(duì)象進(jìn)行綁定.
首先看一下StatementHandler接口定義


image.png

在StatementHandler接口中有四種重要的方法.分別是prepare,parameterize,batch,update.
prepare:用于具體創(chuàng)建一個(gè)Statement對(duì)象或則preparedStatement對(duì)象
parameterize:用于初始化Statement及對(duì)Sql中占位符進(jìn)行賦值.
update:用于通知Statement將[insert,update,delete]推送到數(shù)據(jù)庫
query:用于通知Statement將[select]推送到數(shù)據(jù)庫并返回對(duì)應(yīng)查詢結(jié)果.
5.2 StatementHandler繼承結(jié)構(gòu)


image.png

從上圖可以看到StatementHandler接口下有兩個(gè)直接實(shí)現(xiàn)類BaseStatementHandler和[RoutingStatementHandler]

[]RoutingStatementHandler]:是一個(gè)具體實(shí)現(xiàn)類.在這個(gè)類中并沒有對(duì)Statement對(duì)象進(jìn)行具體使用.只是根據(jù)得到Executor類型,決定創(chuàng)建何種類型StatementHandler對(duì)象.在MyBatis工作時(shí),使用的StatementHandler接口對(duì)象實(shí)際上就是RoutingStatementHandler對(duì)象.
我們可以簡單理解為
StatementHandler statmentHandler = new RountingStatementHandler();

在RountingStatementHandler創(chuàng)建時(shí),就跟根據(jù)接收的Executor類型來創(chuàng)建這個(gè)三個(gè)類型對(duì)象的.

5.3 StatementHandler對(duì)象創(chuàng)建
StatementHandler對(duì)象是在SqlSession對(duì)象接收到操作命令時(shí),由Configuraion中newStatementHandler方法負(fù)責(zé)調(diào)用的.


image.png

RoutingStatementHandler構(gòu)造方法,將會(huì)根據(jù)Executor的類型決定創(chuàng)建SimpleStatementHandler,PreparedStatementHandler,CallableStatementHandler實(shí)例對(duì)象.


image.png

5.4 StatementHandler接口方法介紹
(1) prepare方法:


image.png

prepare方法用于創(chuàng)建一個(gè)(Statement or PreparedStatement or CallableStatement)對(duì)象,并設(shè)置Statement對(duì)象的最大工作時(shí)間和一次性讀取的最大數(shù)據(jù)量.讓后將生成的Statement對(duì)象返回.

prepare方法只在BaseStatementHandler被實(shí)現(xiàn).在其三個(gè)子類中沒有被重寫.用于三個(gè)子類調(diào)用獲得對(duì)應(yīng)的Statement接口對(duì)象.

prepare方法依靠instantiateStatement(connection)方法來返回具體Statement接口對(duì)象.
這個(gè)方法是BaseStatementHandler中定義的抽象方法,由三個(gè)子類來具體實(shí)現(xiàn).

SimpleHandler中的[instantiateStatement] 方法


image.png

PreparedStatementHandler中的[instantiateStatement] 方法


image.png

CallableStatementHandler中的[instantiateStatement] 方法


image.png

(2) parameterize方法
主要為PreparedStatement和CallableStatement傳參.因此只在PreparedStatementHandler和CallableStatementHandler中被重寫
PreparedStatementHandler中的parameterize


image.png

CallableStatementHandler中的parameterize


image.png

在這兩個(gè)方法中,可以看到都是[ParameterHandler]對(duì)象進(jìn)行參數(shù)賦值的.

(3) query方法
輸送查詢查詢語句,并將查詢結(jié)果轉(zhuǎn)換對(duì)應(yīng)的實(shí)體類對(duì)象
SimpleStatementHandler 中的 query 方法


image.png

PreparedStatementHandler中的query方法


image.png

CallableStatementHandler中的query方法
image.png
 可以看到在得到查詢結(jié)果后,都是使用[ResultSetHandler]對(duì)結(jié)果進(jìn)行轉(zhuǎn)換.

(4) update方法
輸送[insert,update,delete]語句并返回處理數(shù)據(jù)行

SimpleStatementHandler中的update方法


image.png

PreparedStatementHandler中update方法


image.png

CallableStatementHandler中update方法


image.png

第6章 SqlSession中四大神器之ParameterHandler
6.1 ParameterHandler簡介
參數(shù)處理器,負(fù)責(zé)為PreparedStatement的sql語句參數(shù)動(dòng)態(tài)賦值


image.png

這個(gè)接口中只有兩個(gè)方法
getParameterObject 方法,用于讀取參數(shù).
setParameters用于對(duì)PreparedStatement的參數(shù)賦值.
6.2 ParameterHandler繼承結(jié)構(gòu)

  只有一個(gè)實(shí)現(xiàn)類DefaultParameterHandler
image.png

6.3 ParameterHandler對(duì)象創(chuàng)建
參數(shù)處理器對(duì)象是在創(chuàng)建StatementHandler對(duì)象同時(shí)被創(chuàng)建的.由Configuration對(duì)象負(fù)責(zé)創(chuàng)建.


image.png

創(chuàng)建時(shí) 傳入三個(gè)對(duì)象:執(zhí)行SQL對(duì)應(yīng)的配置信息MappedStatement、參數(shù)對(duì)象Object,SQL的BoundSql。

注:一個(gè)BoundSql對(duì)象,代表了一次sql語句的實(shí)際執(zhí)行,而SqlSource對(duì)象的責(zé)任,就是根據(jù)傳入的參數(shù)對(duì)象,動(dòng)態(tài)計(jì)算出這個(gè)BoundSql,也就是說Mapper文件中的節(jié)點(diǎn)的計(jì)算,是由SqlSource對(duì)象完成的。SqlSource最常用的實(shí)現(xiàn)類是DynamicSqlSource
6.4 ParameterHandler中的參數(shù)從何而來.


image.png

上述命令的實(shí)參10是如何添加到對(duì)應(yīng)的SQL語句中的.


image.png

在mybatis中,使用動(dòng)態(tài)代理模式.當(dāng)dao.findByDeptNo(10)將要執(zhí)行時(shí);會(huì)被JVM進(jìn)行攔截
交給mybatis中的代理實(shí)現(xiàn)類MapperProxy的invoke方法中
image.png

然后在一步步交給ParameterHandler中setParameter方法,將參數(shù)交給對(duì)應(yīng)占位符
6.5 ParameterHandler中


image.png

image.png

image.png

第7章 SqlSession中四大神器之ResultSetHandler
7.1 ResultSetHandler簡介
ResultSetHandler接口主要負(fù)責(zé)兩件事
(1) 處理Statement執(zhí)行后產(chǎn)生的結(jié)果集,生成結(jié)果列表
(2) 處理存儲(chǔ)過程執(zhí)行后的輸出參數(shù)

image.png

7.2 ResultSetHandler繼承結(jié)構(gòu)
只有一個(gè)實(shí)現(xiàn)類DefaultResultSetHandler

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容