?最近因為使用spring-boot整合mybatis出現(xiàn)了一系列的小問題,而且看到網(wǎng)上有很多解析Mybatis的源碼文章。網(wǎng)絡(luò)上也有兩本書:《深入淺出Mybatis技術(shù)原理與實戰(zhàn)》,《Mybatis從入門到精通》
網(wǎng)絡(luò)博客地址:Mybatis源碼分析?、Mybatis系列
紙上得來終覺淺,絕知此事要躬行
于是開啟了我的Mybatis源碼分析和筆記之路,以目前最新的Mybats3.4.6源碼。于是根據(jù)源代碼追蹤,得出以下時序圖(畫的肯定不怎么好,因為不專業(yè))

我看著這種圖,感覺都懵了。還是得用文字解釋下。Mybatis解析xml生成SqlSessionFactory解析說明
當(dāng)單獨引入mybatis的jar包時,采用讀取mybatis-config.xml配置文件,創(chuàng)建SqlSessionFactory?

1:SqlSessionFactoryBuilder.build() 方法詳解

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

2:XMLConfigBuilder類解析
從build方法中看到XMLConfigBuilder類,從類名得知是mybatis的config建造類。繼承了抽象類:BaseBuilder
這個類的public方法是7個,其中有6個構(gòu)造方法,1個parse解析方法

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

通過上述代碼,得知mybatis解析xml采用的是xpath方式,使用了基類BaseBuilder共享Configuration類信息。最后解析xml的configuration配置返回最終的Configuration對象,給SqlSessionFactoryBuilder類,進(jìn)行創(chuàng)建SqlSessionFactory。new DefaultSqlSessionFactory(config);形成了一個閉環(huán)。因此重點在于XMLConfigBuilder的解析方法。
后面開啟Session,執(zhí)行的入口就是從DefaultSqlSessionFactory開始,下一篇著重分析。
3:BaseBuilder基類解析
為啥要分析這個類,因為這個類是XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、XMLScriptBuilder等所有類的基類。因此非常重要?。?!

比較簡單,公開的就兩個方法,一個構(gòu)造方法,一個是獲取Configuration。三個重要屬性:
Configuration :mybatis核心配置類
TypeAliasRegistry:mybatis的別名依賴注冊類
TypeHandlerRegistry:mybatis類型處理注冊類
其他方法:創(chuàng)建對象實例,返回依賴的類,類型處理器

4:XMLConfigBuilder核心方法parseConfiguration
繼續(xù)回來XMLConfigBuilder類,核心方法:parseConfiguration(parser.evalNode("/configuration"));這個函數(shù)作用非常重要,先解析xml的configure配置,分別是:讀取properties數(shù)據(jù)庫配置、解析settings節(jié)點,加載VFS實現(xiàn),類別名加載,插件加載,設(shè)置databaseId(多數(shù)據(jù)庫支持),類型映射處理器。

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

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

3.DatabaseIdProvider:數(shù)據(jù)庫供應(yīng)商id解析,mysql,oracle動態(tài)個性化語句

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

5:XMLMapperBuilder類
這個類的使用有點類似XMLConfigBuilder的構(gòu)造,解析過程。

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

涉及到解析resultMap節(jié)點,sql節(jié)點,select|insert|update|delete節(jié)點。



核心是:buildStatementFromContext,引出了XMLStatementBuilder類

5:XMLStatementBuilder類
也是BaseBuilder的子類,同樣的構(gòu)造方式,同樣的解析語句節(jié)點。


核心方法langDriver.createSqlSource,引出來:XMLLanguageDriver來生成SqlSource
@Override
public SqlSource createSqlSource(Configuration configuration, XNode script, Class parameterType) {
XMLScriptBuilder builder =new XMLScriptBuilder(configuration, script, parameterType);
return builder.parseScriptNode();
}
得出sql語句的解析流程
6:XMLScriptBuilder解析sql語句

核心方法:MixedSqlNode parseDynamicTags(XNode node)

7.SqlNode接口解析
動態(tài)標(biāo)簽:if、where、foreach等動態(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)記處理器)來進(jìn)行處理,TokenHandler是標(biāo)記真正的處理器

最終得到Configuration類,生成:DefaultSqlSessionFactory類
第二篇重點分析,創(chuàng)建session查詢數(shù)據(jù)庫獲取數(shù)據(jù)