SqlSession中四大神器

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

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


image.png

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

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

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

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

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

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

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

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


image.png

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


image.png

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


image.png

第5章 SqlSession中四大神器之StatementHandler
5.1 StatementHandler簡介
是四大神器中最重要的一個對象,負(fù)責(zé)操作Statement與數(shù)據(jù)庫進行交流.在工作時
還會使用ParameterHandler進行參數(shù)配置,使用ResultHandler將查詢結(jié)果與實體類對象進行綁定.
首先看一下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ù)庫并返回對應(yīng)查詢結(jié)果.
5.2 StatementHandler繼承結(jié)構(gòu)


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方法負(fù)責(zé)調(diào)用的.


image.png

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


image.png

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


image.png

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

prepare方法只在BaseStatementHandler被實現(xiàn).在其三個子類中沒有被重寫.用于三個子類調(diào)用獲得對應(yīng)的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方法
輸送查詢查詢語句,并將查詢結(jié)果轉(zhuǎn)換對應(yīng)的實體類對象
SimpleStatementHandler 中的 query 方法


image.png

PreparedStatementHandler中的query方法


image.png

CallableStatementHandler中的query方法
image.png
 可以看到在得到查詢結(jié)果后,都是使用[ResultSetHandler]對結(jié)果進行轉(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ù)動態(tài)賦值


image.png

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

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

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


image.png

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

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


image.png

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


image.png

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

然后在一步步交給ParameterHandler中setParameter方法,將參數(shù)交給對應(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) 處理存儲過程執(zhí)行后的輸出參數(shù)

image.png

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘶是,一起剝皮案震驚了整個濱河市钙勃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌聂喇,老刑警劉巖辖源,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異希太,居然都是意外死亡克饶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門誊辉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矾湃,“玉大人,你說我怎么就攤上這事堕澄⊙荆” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵蛙紫,是天一觀的道長拍屑。 經(jīng)常有香客問我,道長坑傅,這世上最難降的妖魔是什么僵驰? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上矢渊,老公的妹妹穿的比我還像新娘继准。我一直安慰自己,他們只是感情好矮男,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布移必。 她就那樣靜靜地躺著,像睡著了一般毡鉴。 火紅的嫁衣襯著肌膚如雪崔泵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天猪瞬,我揣著相機與錄音憎瘸,去河邊找鬼。 笑死陈瘦,一個胖子當(dāng)著我的面吹牛幌甘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痊项,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼锅风,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鞍泉?” 一聲冷哼從身側(cè)響起皱埠,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咖驮,沒想到半個月后边器,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡托修,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年忘巧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诀黍。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡袋坑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出眯勾,到底是詐尸還是另有隱情枣宫,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布吃环,位于F島的核電站也颤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏郁轻。R本人自食惡果不足惜翅娶,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一文留、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧竭沫,春花似錦燥翅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谎势,卻和暖如春凛膏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脏榆。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工猖毫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人须喂。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓吁断,卻偏偏與公主長得像,于是被迫代替她去往敵國和親镊折。 傳聞我的和親對象是個殘疾皇子胯府,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容