MyBatis系列 (1) ~ 啟動(dòng)

? ? MyBatis作為一種優(yōu)秀的持久層框架,在不少項(xiàng)目中都有使用。最近抽時(shí)間看了看MyBatis的源碼,今天在這里聊聊MyBatis的啟動(dòng)解析過程,希望能對(duì)大家有所幫助。

?一、 demo及代碼。

? ? 1.MyBatis ?config 配置文件。?

圖1 MyBatis配置文件

? ? 2.sql映射Mapper配置文件。

圖2 mapper配置文件

? ? 3.User類以及user建表語句。

圖3 User類文件
圖4 User表

? ? 4.測(cè)試代碼如下:

圖5 測(cè)試代碼

? 二、MyBatis的啟動(dòng)。

? ? 最關(guān)鍵的就是解析xml文件,生成configuration對(duì)象。SqlSessionFactoryBuilder對(duì)象的build(reader)方法將會(huì)觸發(fā)MyBatis的啟動(dòng),具體過程如下:

? ? 1.在build方法內(nèi)部將會(huì)創(chuàng)建一個(gè)XMLConfigBuilder類型的parser對(duì)象,之后將會(huì)調(diào)用parser的parse方法返回Configuration對(duì)象,再調(diào)用build方法生成DefaultSqlSessionFactory并返回。

圖6 build方法

? ? 2.XMLConfigBuilder構(gòu)造函數(shù)。函數(shù)會(huì)先創(chuàng)建XMLMapperEntityResolver對(duì)象,再創(chuàng)建XPathParser對(duì)象,最后調(diào)用重載構(gòu)造方法(見第5點(diǎn))。

圖7 XMLConfigBuilder構(gòu)造函數(shù)

? ? 3.XMLMapperEntityResolver類。XMLMapperEntityResolver內(nèi)部定義了MyBatisdtd。主要是“CONFIG”以及“MAPPER”。

圖8 XMLMapperEntityResolver類

? ? 4.XPathParser構(gòu)造函數(shù)。利用commonConstructor方法設(shè)置屬性,并利用createDocument方法把InputStream封裝成document對(duì)象。

圖9 XPathParser構(gòu)造函數(shù)

? ? 5.XMLConfigBuilder構(gòu)造函數(shù)_2。在這個(gè)方法內(nèi)部,首先會(huì)創(chuàng)建一個(gè)Configuration對(duì)象,并調(diào)用父類BaseBuilder的構(gòu)造函數(shù),設(shè)置configuration、typeAliasRegistry、typeHandlerRegistry屬性。

圖10 XMLConfigBuilder構(gòu)造函數(shù)_2

? ? 6.Configuration類。Configuration內(nèi)部定義了一些重要的對(duì)象,其實(shí)MyBatis的啟動(dòng)就是根據(jù)配置文件對(duì)Configuration屬性設(shè)置不同的值。重要的屬性如typeHandlerRegistry、typeAliasRegistry、mappedStatements、caches、parameterMaps等。在TypeHandlerRegistryTypeAliasRegistry構(gòu)造函數(shù)內(nèi)部,注冊(cè)了許多常見的TypeHandler和TypeAlias。并且在Configuration的構(gòu)造函數(shù)也注冊(cè)了許多常見MyBatis的TypeAlias。

圖11 Configuration屬性
圖12 TypeHandlerRegistry構(gòu)造函數(shù)
圖13 TypeAliasRegistry構(gòu)造函數(shù)
圖14 Configuration構(gòu)造函數(shù)

? ? 7.parse方法。XMLConfigBuilder對(duì)象創(chuàng)建好以后,就調(diào)用parse方法根據(jù)配置文件設(shè)置configuration對(duì)象。parse方法方法如下,關(guān)鍵是調(diào)用parseConfiguration方法。

圖15 parse方法

? ? 8.parseConfiguration方法。parseConfiguration解析了configuration的配置文件,parseConfiguration方法和configuration配置文件相對(duì)應(yīng)?;旧?,每個(gè)元素都是一個(gè)單獨(dú)的方法。

圖16 parseConfiguration方法
圖17 configuration配置文件結(jié)構(gòu)

? ? 9.mapperElement方法。parseConfiguration方法里,這里重點(diǎn)分析MyBatis如何解析sql映射文件,即mapperElement方法。根據(jù)“package”、“resource”、“url”、“class”采取不同的解析策略。packageclassMapperAnnotationBuilder解析,resourceurl利用XMLMapperBuilder解析。由于demo是配置的resource,所以在此分析XMLMapperBuilder。

圖18 mapperElement方法

? ? 10.XMLMapperBuilder構(gòu)造函數(shù)。其實(shí)XMLMapperBuilder與前面的XMLConfigBuilder非常相似。會(huì)先生成XMLMapperEntityResolver對(duì)象和XPathParser對(duì)象。在利用父類BaseBuilder的構(gòu)造函數(shù)設(shè)置configuration、typeAliasRegistry、typeHandlerRegistry屬性。

圖19 XMLMapperBuilder構(gòu)造函數(shù)
圖20 BaseBuilder構(gòu)造函數(shù)

? ? 11.XMLMapperBuilderparse方法。在parse方法內(nèi)部,關(guān)鍵是調(diào)用configurationElement方法解析mapper配置文件。

圖21 XMLMapperBuilder.parse方法

? ? 12.configurationElement方法。在方法內(nèi)部解析"cache","cache-ref","resultMap","parameterMap","sql","insert","update","delete","select"標(biāo)簽。

圖22 configurationElement方法

? ? 13.Statement的添加。configurationElement方法調(diào)用buildStatementFromContext方法。buildStatementFromContext調(diào)用XMLStatementBuilder.parseStatementNode()方法,在XMLStatementBuilder.parseStatementNode()方法內(nèi)部解析"insert"、"update"、"delete"、"select"標(biāo)簽的屬性(這里代碼有點(diǎn)長),后面通過builderAssistant.addMappedStatement()把statement添加到configuration。

圖23 buildStatementFromContext方法
圖24 XMLStatementBuilder.parseStatementNode()
圖25 statement添加到configuration

? ? 至此,demo中xml對(duì)象的解析過程基本上就完了。后面把Configuration返回給build方法,創(chuàng)建并返回DefaultSqlSessionFactory對(duì)象。關(guān)于MyBatis如何是管理session的下次在介紹。

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

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

  • 1 引言# 本文主要講解JDBC怎么演變到Mybatis的漸變過程,重點(diǎn)講解了為什么要將JDBC封裝成Mybait...
    七寸知架構(gòu)閱讀 77,610評(píng)論 36 979
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評(píng)論 19 139
  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射的優(yōu)秀的...
    笨鳥慢飛閱讀 6,289評(píng)論 0 4
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,894評(píng)論 18 399
  • 不知道什么時(shí)候,我如此眷戀我的床。在暖暖的被窩里沉睡,做上一個(gè)暖暖的夢(mèng)。在夢(mèng)里,上海的永康路依舊璀璨,我們還是相濡...
    艷菲閱讀 328評(píng)論 0 1

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