MyBatis系列 (2) ~ 查詢執(zhí)行過程

? ? 本文繼續(xù)沿用MyBatis系列 (1) ~ 啟動的demo挖胃,并在上文基礎(chǔ)上辽剧,說明MyBatis到底是如何執(zhí)行sql的族淮。MyBatis執(zhí)行一個查詢方法椭迎,可以分為兩步:Session的創(chuàng)建結(jié)果的獲取彰阴。本文的內(nèi)容是基于demo特定代碼的結(jié)果瘾敢,如果你的配置文件或測試代碼不一致,結(jié)果可能不一樣。

一簇抵、Session的創(chuàng)建

? ? 1.如測試代碼所示【測試代碼和demo詳見MyBatis系列 (1) ~ 啟動】庆杜,調(diào)用ssf.openSession方法(圖1),將會返回一個session對象碟摆。而openSession()調(diào)用openSessionFromDataSource方法(圖2)晃财,在openSessionFromDataSource方法(圖3)中configuration.newExecutor會生成一個Executor實例(圖4),而這個Executor對象則是一個CachingExecutor實例典蜕,包裝了SimpleExecutor實例(圖5)拓劝,最后再利用Executor創(chuàng)建DefaultSqlSession實例并返回(圖3),至此session創(chuàng)建完成嘉裤。session對于sql的執(zhí)行郑临,都是利用executor去完成,可以說Executor是seeeion最重要的對象屑宠。

圖1 測試代碼
圖2 openSession方法
圖3 openSessionFromDataSource方法
圖4 configuration.newExecutor方法
圖5 CachingExecutor方法

二厢洞、結(jié)果的獲取

? ? 這個過程大概會經(jīng)過MappedStatement查找、BoundSql的創(chuàng)建典奉、CacheKey的創(chuàng)建躺翻、緩存查找、JDBC操作(數(shù)據(jù)庫Connection建立卫玖、Statement建立公你、參數(shù)設(shè)置、結(jié)果處理)假瞬、緩存更新這幾個步奏陕靠。其中緩存的部分以后再分析。

? ? 1.MappedStatement查找脱茉。從Configuration對象的mappedStatements根據(jù)id獲取剪芥。mappedStatement如何添加到mappedStatements可以參照MyBatis系列 (1) ~ 啟動

圖6 MappedStatement查找

? ? ? ? 2.BoundSql的創(chuàng)建琴许。調(diào)用MappedStatement的getBoundSql方法會創(chuàng)建并返回一個BoundSql實例税肪。BoundSql會封裝好sql、參數(shù)榜田、類型益兄、typeHandler等信息,具體過程如下所示箭券。

圖7 BoundSql的創(chuàng)建

? ? ? ? ? 3.CacheKey的創(chuàng)建净捅。調(diào)用CachingExecutor的createCacheKey方法會返回一個CacheKey對象實例。CacheKey根據(jù)MappedStatement的id邦鲫,偏移量灸叼,sql,參數(shù)庆捺,environment的id標(biāo)識古今。如果他們都相等,則可以判斷CacheKey也相等滔以。ddemo的CacheKey為"-1623403364:769426577:User.selectOneUser:0:2147483647:select t.id,t.name from user t where id = ?:2:development"捉腥。

圖8 CacheKey的創(chuàng)建

? ? ? ? 4.JDBC操作。數(shù)據(jù)庫連接是在這里這里建立的你画,并不是一創(chuàng)建一個session實例就會建立一個連接抵碟。Connection由dataSource的doGetConnection方法返回。參數(shù)是由TypeHandler設(shè)置坏匪。

圖9 JDBC相關(guān)操作
圖10 數(shù)據(jù)庫連接
圖 11 Statement
圖12 參數(shù)設(shè)置
圖13 結(jié)果處理

? ? ? ? 4.更新緩存拟逮。把相關(guān)結(jié)果存到localCache對象中,對于相同的CacheKey适滓,如果緩存中有值敦迄,則不需要到數(shù)據(jù)庫去查詢。

圖14 緩存更新

? ? ? ? 最后把結(jié)果返回給調(diào)用者凭迹,至此罚屋,MyBatis查詢執(zhí)行結(jié)束。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗅绸,一起剝皮案震驚了整個濱河市脾猛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鱼鸠,老刑警劉巖猛拴,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蚀狰,居然都是意外死亡漆弄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門造锅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撼唾,“玉大人,你說我怎么就攤上這事哥蔚〉构龋” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵糙箍,是天一觀的道長渤愁。 經(jīng)常有香客問我,道長深夯,這世上最難降的妖魔是什么抖格? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任诺苹,我火速辦了婚禮,結(jié)果婚禮上雹拄,老公的妹妹穿的比我還像新娘收奔。我一直安慰自己,他們只是感情好滓玖,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布坪哄。 她就那樣靜靜地躺著,像睡著了一般势篡。 火紅的嫁衣襯著肌膚如雪翩肌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天禁悠,我揣著相機(jī)與錄音念祭,去河邊找鬼。 笑死碍侦,一個胖子當(dāng)著我的面吹牛棒卷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播祝钢,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼比规,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拦英?” 一聲冷哼從身側(cè)響起蜒什,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疤估,沒想到半個月后灾常,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡铃拇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年钞瀑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慷荔。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡雕什,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出显晶,到底是詐尸還是另有隱情贷岸,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布磷雇,位于F島的核電站偿警,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏唯笙。R本人自食惡果不足惜螟蒸,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一盒使、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧七嫌,春花似錦少办、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枉疼。三九已至皮假,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骂维,已是汗流浹背惹资。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留航闺,地道東北人褪测。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像潦刃,于是被迫代替她去往敵國和親侮措。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

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