Mybatis源碼第一篇:sqlSessionFactory創(chuàng)建流程

?最近因?yàn)槭褂胹pring-boot整合mybatis出現(xiàn)了一系列的小問(wèn)題炬太,而且看到網(wǎng)上有很多解析Mybatis的源碼文章录煤。網(wǎng)絡(luò)上也有兩本書(shū):《深入淺出Mybatis技術(shù)原理與實(shí)戰(zhàn)》楞黄,《Mybatis從入門到精通》

網(wǎng)絡(luò)博客地址:Mybatis源碼分析?、Mybatis系列


紙上得來(lái)終覺(jué)淺惑惶,絕知此事要躬行

于是開(kāi)啟了我的Mybatis源碼分析和筆記之路设塔,以目前最新的Mybats3.4.6源碼凄吏。于是根據(jù)源代碼追蹤,得出以下時(shí)序圖(畫的肯定不怎么好闰蛔,因?yàn)椴粚I(yè))

mybatis加載xml時(shí)序圖

我看著這種圖,感覺(jué)都懵了图柏。還是得用文字解釋下序六。Mybatis解析xml生成SqlSessionFactory解析說(shuō)明

當(dāng)單獨(dú)引入mybatis的jar包時(shí),采用讀取mybatis-config.xml配置文件蚤吹,創(chuàng)建SqlSessionFactory?

創(chuàng)建sqlSessionFactory入口

1:SqlSessionFactoryBuilder.build() 方法詳解

創(chuàng)建sqlSessionFactory詳解

這個(gè)build是個(gè)多態(tài)方法例诀,有兩種方式讀取xml解析,java.io下面兩個(gè)抽象類随抠,InputStream(字節(jié)流)和Reader(字符流),使用Reader讀取出來(lái)的是char數(shù)組或者String繁涂,使用InputStream讀取出來(lái)的是byte數(shù)組拱她。

創(chuàng)建sqlSessionFactory詳解2

2:XMLConfigBuilder類解析

從build方法中看到XMLConfigBuilder類,從類名得知是mybatis的config建造類扔罪。繼承了抽象類:BaseBuilder

這個(gè)類的public方法是7個(gè)秉沼,其中有6個(gè)構(gòu)造方法,1個(gè)parse解析方法

XMLConfigBuilder解析

具體看下構(gòu)造方法和解析矿酵。1.設(shè)置XPathparser解析唬复,2.使用構(gòu)造方法使用了super關(guān)鍵字,采用的是基類BaseBuilder的構(gòu)造方法全肮,初始化Configuration類敞咧。3.解析xml的configuration節(jié)點(diǎn)。

XMLConfigBuilder核心方法

通過(guò)上述代碼辜腺,得知mybatis解析xml采用的是xpath方式休建,使用了基類BaseBuilder共享Configuration類信息。最后解析xml的configuration配置返回最終的Configuration對(duì)象评疗,給SqlSessionFactoryBuilder類丰包,進(jìn)行創(chuàng)建SqlSessionFactory。new DefaultSqlSessionFactory(config);形成了一個(gè)閉環(huán)壤巷。因此重點(diǎn)在于XMLConfigBuilder的解析方法邑彪。

后面開(kāi)啟Session,執(zhí)行的入口就是從DefaultSqlSessionFactory開(kāi)始,下一篇著重分析胧华。

3:BaseBuilder基類解析

為啥要分析這個(gè)類寄症,因?yàn)檫@個(gè)類是XMLConfigBuilder、XMLMapperBuilder矩动、XMLStatementBuilder有巧、XMLScriptBuilder等所有類的基類。因此非常重要1弧@河!

BaseBuilder基類和所有父類概況

比較簡(jiǎn)單示姿,公開(kāi)的就兩個(gè)方法甜橱,一個(gè)構(gòu)造方法,一個(gè)是獲取Configuration栈戳。三個(gè)重要屬性:

Configuration :mybatis核心配置類

TypeAliasRegistry:mybatis的別名依賴注冊(cè)類

TypeHandlerRegistry:mybatis類型處理注冊(cè)類

其他方法:創(chuàng)建對(duì)象實(shí)例岂傲,返回依賴的類,類型處理器


BaseBuilder的其他方法

4:XMLConfigBuilder核心方法parseConfiguration

繼續(xù)回來(lái)XMLConfigBuilder類子檀,核心方法:parseConfiguration(parser.evalNode("/configuration"));這個(gè)函數(shù)作用非常重要镊掖,先解析xml的configure配置乃戈,分別是:讀取properties數(shù)據(jù)庫(kù)配置、解析settings節(jié)點(diǎn)亩进,加載VFS實(shí)現(xiàn)症虑,類別名加載,插件加載归薛,設(shè)置databaseId(多數(shù)據(jù)庫(kù)支持)谍憔,類型映射處理器。

XMLConfigBuilder核心方法parseConfiguration

1.Environment 數(shù)據(jù)庫(kù)環(huán)境苟翻,采用建造者模式構(gòu)建韵卤。里面有數(shù)據(jù)庫(kù)配置信息

Environment 對(duì)象創(chuàng)建

2.Interceptor:攔截器插件,實(shí)現(xiàn)分頁(yè)攔截

攔截器

3.DatabaseIdProvider:數(shù)據(jù)庫(kù)供應(yīng)商id解析崇猫,mysql沈条,oracle動(dòng)態(tài)個(gè)性化語(yǔ)句

datasourceId

4.核心解析:XMLMapperBuilder解析mapper節(jié)點(diǎn)信息。

XMLMapperBuilder解析

5:XMLMapperBuilder類

這個(gè)類的使用有點(diǎn)類似XMLConfigBuilder的構(gòu)造诅炉,解析過(guò)程蜡歹。

XMLMapperBuilder構(gòu)造方法和parse

MapperBuilderAssistant類和核心方法configurationElement(XNode context)

configurationElement

涉及到解析resultMap節(jié)點(diǎn),sql節(jié)點(diǎn)涕烧,select|insert|update|delete節(jié)點(diǎn)月而。

parameterMap
resultMap
sql片段

核心是:buildStatementFromContext,引出了XMLStatementBuilder類

XMLStatementBuilder

5:XMLStatementBuilder類

也是BaseBuilder的子類议纯,同樣的構(gòu)造方式父款,同樣的解析語(yǔ)句節(jié)點(diǎn)。

1
2

核心方法langDriver.createSqlSource瞻凤,引出來(lái):XMLLanguageDriver來(lái)生成SqlSource

@Override

public SqlSource createSqlSource(Configuration configuration, XNode script, Class parameterType) {

XMLScriptBuilder builder =new XMLScriptBuilder(configuration, script, parameterType);

return builder.parseScriptNode();

}

得出sql語(yǔ)句的解析流程

6:XMLScriptBuilder解析sql語(yǔ)句

XMLScriptBuilder

核心方法:MixedSqlNode parseDynamicTags(XNode node)

動(dòng)態(tài)標(biāo)簽

7.SqlNode接口解析

動(dòng)態(tài)標(biāo)簽:if憨攒、where、foreach等動(dòng)態(tài)標(biāo)簽解析

SqlNode接口實(shí)現(xiàn)
SqlNote


8:DynamicContext類

采用ognl表達(dá)式

dynamicContext

9:GenericTokenParser和TokenHandler

通用標(biāo)記解析器和標(biāo)記處理器阀参,通用標(biāo)記解析器處理的是SQL腳本中#{parameter}肝集、${parameter}參數(shù),根據(jù)給定TokenHandler(標(biāo)記處理器)來(lái)進(jìn)行處理蛛壳,TokenHandler是標(biāo)記真正的處理器

標(biāo)記處理器

最終得到Configuration類杏瞻,生成:DefaultSqlSessionFactory類

第二篇重點(diǎn)分析,創(chuàng)建session查詢數(shù)據(jù)庫(kù)獲取數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末衙荐,一起剝皮案震驚了整個(gè)濱河市捞挥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赫模,老刑警劉巖树肃,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瀑罗,居然都是意外死亡胸嘴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門斩祭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)劣像,“玉大人,你說(shuō)我怎么就攤上這事摧玫《龋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵诬像,是天一觀的道長(zhǎng)屋群。 經(jīng)常有香客問(wèn)我,道長(zhǎng)坏挠,這世上最難降的妖魔是什么芍躏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮降狠,結(jié)果婚禮上对竣,老公的妹妹穿的比我還像新娘。我一直安慰自己榜配,他們只是感情好否纬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蛋褥,像睡著了一般临燃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烙心,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天膜廊,我揣著相機(jī)與錄音,去河邊找鬼弃理。 笑死溃论,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痘昌。 我是一名探鬼主播钥勋,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辆苔!你這毒婦竟也來(lái)了算灸?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤驻啤,失蹤者是張志新(化名)和其女友劉穎菲驴,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體骑冗,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赊瞬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年先煎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巧涧。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡薯蝎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谤绳,到底是詐尸還是另有隱情占锯,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布缩筛,位于F島的核電站消略,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏瞎抛。R本人自食惡果不足惜艺演,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望婿失。 院中可真熱鬧钞艇,春花似錦、人聲如沸豪硅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)懒浮。三九已至飘弧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砚著,已是汗流浹背次伶。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稽穆,地道東北人冠王。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像舌镶,于是被迫代替她去往敵國(guó)和親柱彻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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