?最近因?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è))
我看著這種圖,感覺(jué)都懵了图柏。還是得用文字解釋下序六。Mybatis解析xml生成SqlSessionFactory解析說(shuō)明
當(dāng)單獨(dú)引入mybatis的jar包時(shí),采用讀取mybatis-config.xml配置文件蚤吹,創(chuàng)建SqlSessionFactory?
1:SqlSessionFactoryBuilder.build() 方法詳解
這個(gè)build是個(gè)多態(tài)方法例诀,有兩種方式讀取xml解析,java.io下面兩個(gè)抽象類随抠,InputStream(字節(jié)流)和Reader(字符流),使用Reader讀取出來(lái)的是char數(shù)組或者String繁涂,使用InputStream讀取出來(lái)的是byte數(shù)組拱她。
2:XMLConfigBuilder類解析
從build方法中看到XMLConfigBuilder類,從類名得知是mybatis的config建造類扔罪。繼承了抽象類:BaseBuilder
這個(gè)類的public方法是7個(gè)秉沼,其中有6個(gè)構(gòu)造方法,1個(gè)parse解析方法
具體看下構(gòu)造方法和解析矿酵。1.設(shè)置XPathparser解析唬复,2.使用構(gòu)造方法使用了super關(guān)鍵字,采用的是基類BaseBuilder的構(gòu)造方法全肮,初始化Configuration類敞咧。3.解析xml的configuration節(jié)點(diǎn)。
通過(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弧@河!
比較簡(jiǎn)單示姿,公開(kāi)的就兩個(gè)方法甜橱,一個(gè)構(gòu)造方法,一個(gè)是獲取Configuration栈戳。三個(gè)重要屬性:
Configuration :mybatis核心配置類
TypeAliasRegistry:mybatis的別名依賴注冊(cè)類
TypeHandlerRegistry:mybatis類型處理注冊(cè)類
其他方法:創(chuàng)建對(duì)象實(shí)例岂傲,返回依賴的類,類型處理器
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ù)支持)谍憔,類型映射處理器。
1.Environment 數(shù)據(jù)庫(kù)環(huán)境苟翻,采用建造者模式構(gòu)建韵卤。里面有數(shù)據(jù)庫(kù)配置信息
2.Interceptor:攔截器插件,實(shí)現(xiàn)分頁(yè)攔截
3.DatabaseIdProvider:數(shù)據(jù)庫(kù)供應(yīng)商id解析崇猫,mysql沈条,oracle動(dòng)態(tài)個(gè)性化語(yǔ)句
4.核心解析:XMLMapperBuilder解析mapper節(jié)點(diǎn)信息。
5:XMLMapperBuilder類
這個(gè)類的使用有點(diǎn)類似XMLConfigBuilder的構(gòu)造诅炉,解析過(guò)程蜡歹。
MapperBuilderAssistant類和核心方法configurationElement(XNode context)
涉及到解析resultMap節(jié)點(diǎn),sql節(jié)點(diǎn)涕烧,select|insert|update|delete節(jié)點(diǎn)月而。
核心是:buildStatementFromContext,引出了XMLStatementBuilder類
5:XMLStatementBuilder類
也是BaseBuilder的子類议纯,同樣的構(gòu)造方式父款,同樣的解析語(yǔ)句節(jié)點(diǎn)。
核心方法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ǔ)句
核心方法:MixedSqlNode parseDynamicTags(XNode node)
7.SqlNode接口解析
動(dòng)態(tài)標(biāo)簽:if憨攒、where、foreach等動(dòng)態(tài)標(biāo)簽解析
8:DynamicContext類
采用ognl表達(dá)式
9:GenericTokenParser和TokenHandler
通用標(biāo)記解析器和標(biāo)記處理器阀参,通用標(biāo)記解析器處理的是SQL腳本中#{parameter}肝集、${parameter}參數(shù),根據(jù)給定TokenHandler(標(biāo)記處理器)來(lái)進(jìn)行處理蛛壳,TokenHandler是標(biāo)記真正的處理器
最終得到Configuration類杏瞻,生成:DefaultSqlSessionFactory類
第二篇重點(diǎn)分析,創(chuàng)建session查詢數(shù)據(jù)庫(kù)獲取數(shù)據(jù)