接上一篇博文,這一篇來講述怎么實現(xiàn)SchemaSqlMapperParserDelegate——解析SqlMapper配置文件。
要想實現(xiàn)SqlMapper文件的解析,還需要仔細(xì)分析一下mybatis的源碼,我畫了一個圖來協(xié)助理解,也可以幫助形成一個整體概念:
當(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容器中注入,由用戶直接注入一個Configuration對象
2.根據(jù)mybatis-config.xml中加載,而mybatis-config.xml的路徑由configLocation指定,配置文件使用組件XMLConfigBuilder來解析
3.采用mybatis內(nèi)部默認(rèn)的方式,直接new一個配置對象Configuration
這里為了簡單,偷一個懶,不具體分析XMLConfigBuilder了,而直接采用spring中注入的方式,這種方式也給了擴展Configuration一個極大的自由。
二、讀取所有SqlMapper.xml配置文件
也有兩種方式,一種是手工配置,一種是使用自動掃描。推薦的自然是自動掃描,就不多說了。
加載所有SqlMapper.xml配置文件之后就是循環(huán)處理每一個文件了。
三、解析單個SqlMapper.xml配置文件
單個SqlMapper.xml文件的解析入口是SqlSessionFactoryBean的doParseSqlMapperResource()方法,在這個方法中,自動偵測是DTD還是XSD,然后分兩條并行路線分別解析:
1、DTD模式:創(chuàng)建XMLMapperBuilder對象進行解析
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òu)建執(zhí)行單元(resultMap|parameterMap|sql)或者影響執(zhí)行單元的行為的(cache|cache-ref)。
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26