SqlSession中四大神器

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

4.2 Executor繼承結構


image.png

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

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

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

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

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

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

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

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


image.png

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


image.png

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


image.png

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


image.png

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


image.png

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

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

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

5.3 StatementHandler對象創(chuàng)建
StatementHandler對象是在SqlSession對象接收到操作命令時,由Configuraion中newStatementHandler方法負責調用的.


image.png

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


image.png

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


image.png

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

prepare方法只在BaseStatementHandler被實現(xiàn).在其三個子類中沒有被重寫.用于三個子類調用獲得對應的Statement接口對象.

prepare方法依靠instantiateStatement(connection)方法來返回具體Statement接口對象.
這個方法是BaseStatementHandler中定義的抽象方法,由三個子類來具體實現(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

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

(3) query方法
輸送查詢查詢語句,并將查詢結果轉換對應的實體類對象
SimpleStatementHandler 中的 query 方法


image.png

PreparedStatementHandler中的query方法


image.png

CallableStatementHandler中的query方法
image.png
 可以看到在得到查詢結果后,都是使用[ResultSetHandler]對結果進行轉換.

(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ù)處理器,負責為PreparedStatement的sql語句參數(shù)動態(tài)賦值


image.png

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

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

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


image.png

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

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


image.png

上述命令的實參10是如何添加到對應的SQL語句中的.


image.png

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

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


image.png

image.png

image.png

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

image.png

7.2 ResultSetHandler繼承結構
只有一個實現(xiàn)類DefaultResultSetHandler

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容