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

?最近因為使用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時序圖

我看著這種圖,感覺都懵了。還是得用文字解釋下。Mybatis解析xml生成SqlSessionFactory解析說明

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

創(chuàng)建sqlSessionFactory入口

1:SqlSessionFactoryBuilder.build() 方法詳解

創(chuàng)建sqlSessionFactory詳解

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

創(chuàng)建sqlSessionFactory詳解2

2:XMLConfigBuilder類解析

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

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

XMLConfigBuilder解析

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

XMLConfigBuilder核心方法

通過上述代碼,得知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等所有類的基類。因此非常重要?。?!

BaseBuilder基類和所有父類概況

比較簡單,公開的就兩個方法,一個構(gòu)造方法,一個是獲取Configuration。三個重要屬性:

Configuration :mybatis核心配置類

TypeAliasRegistry:mybatis的別名依賴注冊類

TypeHandlerRegistry:mybatis類型處理注冊類

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


BaseBuilder的其他方法

4:XMLConfigBuilder核心方法parseConfiguration

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

XMLConfigBuilder核心方法parseConfiguration

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

Environment 對象創(chuàng)建

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

攔截器

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

datasourceId

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

XMLMapperBuilder解析

5:XMLMapperBuilder類

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

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

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

configurationElement

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

parameterMap
resultMap
sql片段

核心是:buildStatementFromContext,引出了XMLStatementBuilder類

XMLStatementBuilder

5:XMLStatementBuilder類

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

1
2

核心方法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語句

XMLScriptBuilder

核心方法:MixedSqlNode parseDynamicTags(XNode node)

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

7.SqlNode接口解析

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

SqlNode接口實現(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)記處理器)來進(jìn)行處理,TokenHandler是標(biāo)記真正的處理器

標(biāo)記處理器

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容