接上一篇博文,這一篇來講述怎么實(shí)現(xiàn)SchemaSqlMapperParserDelegate——解析SqlMapper配置文件。
要想實(shí)現(xiàn)SqlMapper文件的解析,還需要仔細(xì)分析一下mybatis的源碼,我畫了一個(gè)圖來協(xié)助理解,也可以幫助形成一個(gè)整體概念:
當(dāng)然,這幅圖不止是原生的解析,也包括了XSD模式下的解析,下面對(duì)著這幅圖來說明一下。
一、Mybatis全局配置
Mybatis的全局配置,對(duì)應(yīng)內(nèi)存對(duì)象為Configuration,是重量級(jí)對(duì)象,和數(shù)據(jù)源DataSource、會(huì)話工廠SqlSessionFactory屬于同一級(jí)別,一般來說(單數(shù)據(jù)源系統(tǒng))是全局單例。從SqlSessionFactoryBean的doGetConfigurationWrapper()方法可以看到,有三種方式構(gòu)建,優(yōu)先級(jí)依次為:
1.spring容器中注入,由用戶直接注入一個(gè)Configuration對(duì)象
2.根據(jù)mybatis-config.xml中加載,而mybatis-config.xml的路徑由configLocation指定,配置文件使用組件XMLConfigBuilder來解析
3.采用mybatis內(nèi)部默認(rèn)的方式,直接new一個(gè)配置對(duì)象Configuration
這里為了簡(jiǎn)單,偷一個(gè)懶,不具體分析XMLConfigBuilder了,而直接采用spring中注入的方式,這種方式也給了擴(kuò)展Configuration一個(gè)極大的自由。
二、讀取所有SqlMapper.xml配置文件
也有兩種方式,一種是手工配置,一種是使用自動(dòng)掃描。推薦的自然是自動(dòng)掃描,就不多說了。
加載所有SqlMapper.xml配置文件之后就是循環(huán)處理每一個(gè)文件了。
三、解析單個(gè)SqlMapper.xml配置文件
單個(gè)SqlMapper.xml文件的解析入口是SqlSessionFactoryBean的doParseSqlMapperResource()方法,在這個(gè)方法中,自動(dòng)偵測(cè)是DTD還是XSD,然后分兩條并行路線分別解析:
1、DTD模式:創(chuàng)建XMLMapperBuilder對(duì)象進(jìn)行解析
2、XSD模式:根據(jù)ini配置文件,找到sqlmapper命名空間的處理器SchemaSqlMapperNamespaceParser,該解析器將具體的解析工作委托給SchemaSqlMapperParserDelegate類。
四、解析Statement級(jí)元素
Statement級(jí)元素指的是根元素<mapper>的一級(jí)子元素,這些元素有cache|cache-ref|resultMap|parameterMap|sql|insert|update|delete|select,其中insert|update|delete|select就是通常所說的增刪改查,用于構(gòu)建mybatis一次執(zhí)行單元,也就是說,每一次mybatis方法調(diào)用都是對(duì) insert|update|delete|select 元素的一次訪問,而不能說只訪問select的某個(gè)下級(jí)子元素;其它的一級(jí)子元素則是用于幫助構(gòu)建執(zhí)行單元(resultMap|parameterMap|sql)或者影響執(zhí)行單元的行為的(cache|cache-ref)。
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26