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

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

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


? ? 4.測(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并返回。

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

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

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

? ? 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屬性。

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




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

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


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

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


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

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

? ? 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。



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