接上一篇博文,這一篇來講述怎么實(shí)現(xiàn)SchemaSqlMapperParserDelegate——解析SqlMapper配置文件。

要想實(shí)現(xiàn)SqlMapper文件的解析,還需要仔細(xì)分析一下mybatis的源碼,我畫了一個(gè)圖來協(xié)助理解,也可以幫助形成一個(gè)整體概念:


當(dāng)然,這幅圖不止是原生的解析,也包括了XSD模式下的解析,下面對著這幅圖來說明一下。

一、Mybatis全局配置

Mybatis的全局配置,對應(yīng)內(nèi)存對象為Configuration,是重量級對象,和數(shù)據(jù)源DataSource、會話工廠SqlSessionFactory屬于同一級別,一般來說(單數(shù)據(jù)源系統(tǒng))是全局單例。從SqlSessionFactoryBean的doGetConfigurationWrapper()方法可以看到,有三種方式構(gòu)建,優(yōu)先級依次為:

1.spring容器中注入,由用戶直接注入一個(gè)Configuration對象

2.根據(jù)mybatis-config.xml中加載,而mybatis-config.xml的路徑由configLocation指定,配置文件使用組件XMLConfigBuilder來解析

3.采用mybatis內(nèi)部默認(rèn)的方式,直接new一個(gè)配置對象Configuration

這里為了簡單,偷一個(gè)懶,不具體分析XMLConfigBuilder了,而直接采用spring中注入的方式,這種方式也給了擴(kuò)展Configuration一個(gè)極大的自由。

二、讀取所有SqlMapper.xml配置文件

也有兩種方式,一種是手工配置,一種是使用自動掃描。推薦的自然是自動掃描,就不多說了。

加載所有SqlMapper.xml配置文件之后就是循環(huán)處理每一個(gè)文件了。

三、解析單個(gè)SqlMapper.xml配置文件

單個(gè)SqlMapper.xml文件的解析入口是SqlSessionFactoryBean的doParseSqlMapperResource()方法,在這個(gè)方法中,自動偵測是DTD還是XSD,然后分兩條并行路線分別解析:

1、DTD模式:創(chuàng)建XMLMapperBuilder對象進(jìn)行解析

2、XSD模式:根據(jù)ini配置文件,找到sqlmapper命名空間的處理器SchemaSqlMapperNamespaceParser,該解析器將具體的解析工作委托給SchemaSqlMapperParserDelegate類。

四、解析Statement級元素

Statement級元素指的是根元素<mapper>的一級子元素,這些元素有cache|cache-ref|resultMap|parameterMap|sql|insert|update|delete|select,其中insert|update|delete|select就是通常所說的增刪改查,用于構(gòu)建mybatis一次執(zhí)行單元,也就是說,每一次mybatis方法調(diào)用都是對 insert|update|delete|select 元素的一次訪問,而不能說只訪問select的某個(gè)下級子元素;其它的一級子元素則是用于幫助構(gòu)建執(zhí)行單元(resultMap|parameterMap|sql)或者影響執(zhí)行單元的行為的(cache|cache-ref)。

網(wǎng)友評論