二珍特、源碼分析之mybatis基礎(chǔ)架構(gòu)

前面我們學(xué)習(xí)了mybatis的基本用法祝峻,但是作為優(yōu)秀的開發(fā)者不能止步于用,要"知其然,知其所以然"莱找。本系列博文將對mybatis源碼進(jìn)行深入剖析酬姆,讓其深刻的理解mybatis內(nèi)部的運(yùn)行機(jī)制。

一奥溺、mybatis架構(gòu)簡介

mybatis基礎(chǔ)架構(gòu)圖

以上是mybatis的基礎(chǔ)架構(gòu)圖辞色,下面針對圖中的眾多的組件進(jìn)行簡單的介紹。

1浮定、引導(dǎo)層

  • 引導(dǎo)層主要是關(guān)于myabtis的配置相關(guān)相满,mybatis提供了兩種方式進(jìn)行配置:一種是采用硬編碼方式,基于Java API完成的桦卒;一種是基于xml配置方式完成的立美。由于硬編碼受靈活性限制,實(shí)際運(yùn)用中通常是使用xml的配置方法對myabtis進(jìn)行配置闸盔。

2悯辙、基礎(chǔ)支持層

  • 該層包含整個mybatis的基礎(chǔ)模塊琳省,這些模塊為核心處理層的功能提供了良好的支撐
    (1)反射模塊

myabtis提供了反射模塊迎吵,該模塊對java原生的反射進(jìn)行了良好的封裝,提供了更加簡潔易用的API针贬,同時對反射進(jìn)行了一系列的優(yōu)化击费,比如緩存了類的元數(shù)據(jù)。

(2)類型轉(zhuǎn)換模塊

類型轉(zhuǎn)換功能之一就是為簡化配置文件提供了別名機(jī)制桦他;類型轉(zhuǎn)換另一個功能就是實(shí)現(xiàn)JDBC與JAVA類之間的轉(zhuǎn)換(在sql語句綁定參數(shù)與映射結(jié)果集時候涉及比較多)

(3)日志模塊

集成眾多的第三方日志框架

(4)資源加載模塊

資源加載模塊主要是對類加載器進(jìn)行了封裝蔫巩,確定類加載器的使用順序,并提供了加載文件以及其他資源文件的功能

(5)解析器模塊

解析器模塊主要提供了兩個功能:一個是對xpath的封裝快压,解析config和mapper配置文件圆仔;另一個是提供處理動態(tài)的sql語句中的占位符號的支持

(6)數(shù)據(jù)源模塊

提供了相應(yīng)的數(shù)據(jù)源實(shí)現(xiàn),同時提供了與第三方數(shù)據(jù)源集成的接口

(7)事物管理

mybatis對數(shù)據(jù)庫的事物做了抽象蔫劣,其自身提供了相應(yīng)的事務(wù)接口和簡單實(shí)現(xiàn)坪郭。但是通常是與spring集成,并由spring框架管理事務(wù)

(8)緩存模塊

mybatis提供了一級和二級緩存脉幢,這兩級緩存是依賴于基礎(chǔ)支持層中的緩存模塊實(shí)現(xiàn)的

(9)binding模塊

mybatis通過binding模塊將用戶自定義的mapper接口與映射配置文件關(guān)聯(lián)起來歪沃,系統(tǒng)可以通過調(diào)用自定義的mappe接口中的方法進(jìn)行執(zhí)行相應(yīng)的sql語句完成數(shù)據(jù)庫操作

3、核心處理層

  • 核心處理層是mybatis的核心處理流程嫌松,其中包括mybatis的初始化以及完成一次數(shù)據(jù)庫操作的涉及的全部流程也難怪
    (1)配置解析

在mybatis初始化過程中沪曙,會加載config配置文件和mapper映射文件及mapper接口中的注解信息,解析后的配置信息會形成相應(yīng)的對象保存到Configuration中萎羔。然后利用configuration對象創(chuàng)建sqlSessionFactory對象液走,在創(chuàng)建SqlSession對象,進(jìn)而完成數(shù)據(jù)庫的操作。

(2)Sql解析與scripting模塊

mybatis實(shí)現(xiàn)了動態(tài)sql語句的功能缘眶,通過sql語句的解析腻窒,完成動態(tài)靈活sql的需求。mybatis中的scripting模塊會根據(jù)用戶傳入的實(shí)際參數(shù)磅崭,解析映射文件中定義的動態(tài)sql節(jié)點(diǎn)儿子,并形成數(shù)據(jù)庫可執(zhí)行的sql語句。

(3)sql語句執(zhí)行

整個sql語句執(zhí)行過程中比較重要的是Executor砸喻、statementHandler柔逼、ParameterHandler和ResultSetHandler
1、Executor主要負(fù)責(zé)一級緩存和二級緩存及事物相關(guān)操作割岛,并將數(shù)據(jù)庫相關(guān)操作委托給StatementHandler完成
2愉适、StatementHandler首先通過ParameterHandler完成Sql語句的參數(shù)綁定,然后通過java原生的Statement對象執(zhí)行Sql語句并得到結(jié)果集癣漆,然后通過ResultSetHandler完成結(jié)果集映射维咸,得到結(jié)果對象并返回。

執(zhí)行sql簡單流程圖

(4)插件

用戶可以通過插件的方式對mybatis進(jìn)行擴(kuò)展惠爽,用戶自定義的插件可以改變mybatis的默認(rèn)行為癌蓖。在使用自定義插件之前需要了解mybatis的內(nèi)部原理,才能編寫出高效婚肆、安全的插件

4租副、接口層

  • 接口層核心就是SqlSession接口,該接口定義了Mybatis暴露給應(yīng)用程序使用的API较性。

二用僧、mybatis重要組件分析

  • 上面我們分析了mybatis的架構(gòu),知道了mybatis是由哪些組件組成的以及對組件做了簡單的介紹赞咙。但作為源碼分析责循,上面提高的內(nèi)容并非全部是重點(diǎn),mybatis框架中重點(diǎn)要關(guān)注的其實(shí)就10幾個類攀操,好好理解這10幾個類院仿,然后做一個串聯(lián),理清運(yùn)行流程崔赌,基本就能讀懂mybatis原理了意蛀。下面我將重點(diǎn)羅列出要關(guān)注的類:

  • SqlSession:作為MyBatis工作的主要頂層API,表示和數(shù)據(jù)庫交互的會話健芭,完成必要數(shù)據(jù)庫增刪改查功能县钥;

  • Executor:MyBatis執(zhí)行器,是MyBatis 調(diào)度的核心慈迈,負(fù)責(zé)SQL語句的生成和查詢緩存的維護(hù)若贮;

  • StatementHandler:封裝了JDBC Statement操作省有,負(fù)責(zé)對JDBC statement 的操作,如設(shè)置參數(shù)谴麦、將Statement結(jié)果集轉(zhuǎn)換成List集合蠢沿。

  • ParameterHandler:負(fù)責(zé)對用戶傳遞的參數(shù)轉(zhuǎn)換成JDBC Statement 所需要的參數(shù);

  • ResultSetHandler:負(fù)責(zé)將JDBC返回的ResultSet結(jié)果集對象轉(zhuǎn)換成List類型的集合匾效;

  • TypeHandler:負(fù)責(zé)java數(shù)據(jù)類型和jdbc數(shù)據(jù)類型之間的映射和轉(zhuǎn)換舷蟀;

  • MappedStatement:MappedStatement維護(hù)了一條<select|update|delete|insert>節(jié)點(diǎn)的封裝;

  • SqlSource:負(fù)責(zé)根據(jù)用戶傳遞的parameterObject面哼,動態(tài)地生成SQL語句野宜,將信息封裝到BoundSql對象中,并返回魔策;

  • BoundSql:表示動態(tài)生成的SQL語句以及相應(yīng)的參數(shù)信息匈子;

  • Configuration:MyBatis所有的配置信息都維持在Configuration對象之中;

mybatis核心類之間的關(guān)系

參考:
《mybatis技術(shù)內(nèi)幕》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闯袒,一起剝皮案震驚了整個濱河市虎敦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌政敢,老刑警劉巖其徙,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異堕仔,居然都是意外死亡擂橘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門摩骨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朗若,你說我怎么就攤上這事恼五。” “怎么了哭懈?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵灾馒,是天一觀的道長。 經(jīng)常有香客問我遣总,道長睬罗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任旭斥,我火速辦了婚禮容达,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垂券。我一直安慰自己花盐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著算芯,像睡著了一般柒昏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上熙揍,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天职祷,我揣著相機(jī)與錄音,去河邊找鬼届囚。 笑死堪旧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奖亚。 我是一名探鬼主播淳梦,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昔字!你這毒婦竟也來了爆袍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤作郭,失蹤者是張志新(化名)和其女友劉穎陨囊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夹攒,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜘醋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了咏尝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片压语。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖编检,靈堂內(nèi)的尸體忽然破棺而出胎食,到底是詐尸還是另有隱情,我是刑警寧澤允懂,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布厕怜,位于F島的核電站,受9級特大地震影響蕾总,放射性物質(zhì)發(fā)生泄漏粥航。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一生百、第九天 我趴在偏房一處隱蔽的房頂上張望递雀。 院中可真熱鬧,春花似錦置侍、人聲如沸映之。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杠输。三九已至赎败,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蠢甲,已是汗流浹背僵刮。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹦牛,地道東北人搞糕。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像曼追,于是被迫代替她去往敵國和親窍仰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354