sql server解析xml属性为表格_[Mybatis][基础支持层]mapper xml sql 解析
Mybatis 中 標簽解析,主要是為了得到兩大部分數據
1、Mapper.class 接口
2、SQL 執行語句,結果集映射關系等數據
在上一章中提到了 Mapper.class 文件的解析,Mapper.class 是接口文件,該接口是發起SQl執行調用的 API 入口,所有相關的操作都在其代理類 MapperProxy 中完成。
在上一章中忽略了 Mapper.class 文件中 @Select 等 SQL 語句注解的解析,本次章節將和 xml 中的 sql 解析一起分析。
`` 標簽解析入口
來回顧一下,XMLConfigBuilder 解析時序簡圖,如下:
在時序圖中 加載解析在 XMLConfigBuilder#mapperElement 中完成,相關解析代碼如下:
如上述代碼,針對 子標簽的解析分為兩種:掃包批量解析和單個文件解析。
而無論是掃包批量解析亦或者單個文件解析,都會對 xml 文件 和 class 文件進行解析處理。
上一章以單個文件解析為入口分析 Mapper.class 文件的加載。
并提到了單個文件 標簽配置的三種屬性:
resource
url
class
這三種屬性的配置都會嘗試解析 xml 中的數據和 Mapper.class 上的 @Select 等注解,而 resource ?和 url 所配置的直接就是 xml 路徑,加載了 xml 通過命名空間即可找到關聯對應的 Mapper.class 進行解析。
而 class 配置,如果要找到對應的 xml 文件,需要按照既定的規約給 xml 文件命名,規約為:Mapper.class.getName() + .xml
本次 sql 相關解析以單個文件的 resource 配置解析為入口展開,對應的解析入口代碼為
從代碼中,能夠知道完成 xml 文件解析的類為 XMLMapperBuilder,而進行解析的入口方法為 XMLMapperBuilder#parse。
來具體看看 XMLMapperBuilder#parse XML 文件解析入口代碼
如上述代碼,解析入口職責也很清晰,對 xml 文件和 mapper ?class 文件進行了解析。
下面分別進入到各自的方法中查看各自是如何進行 sql 解析的。
xml 文件解析
xml 文件解析代碼入口方法 XMLMapperBuilder#configurationElement
相關代碼如下:
在上述解析代碼中,針對 xml 文件中的各種標簽進行解析,如 、、、 等。
解析后的結果會被存儲到 Configuration 中,例如:
解析后的結果存儲在 Configuration 的 caches 屬性中,該屬性定義如下
/** 容器:存放 Mapper.xml 中的 構建的 Cache **//** key:為 Mapper.xml 中的 namespace **/protected final Map caches = new StrictMap<>("Caches collection");解析后的結果存儲在 Configuration 中的 resultMaps 屬性中,該屬性定義如下
/** 容器:存放 Mapper.xml 中的 構建的 ResultMap 對象 **//** key 通常為:namespace + "." + id【 中的id屬性值】 **/protected final Map<String, ResultMap> resultMaps = new StrictMap<>("Result Maps collection");等標簽的解析會由新的對象 XMLStatementBuilder 進行解析,解析后的結果存儲在Configuration 中的 mappedStatements 屬性中,該屬性定義如下:
/** 容器:存放 Mapper.xml 文件中 標簽的解析數據 **//** key = namespace + id 屬性 = Mapper.java 全類名 + id 屬性 **/protected final Map<String, MappedStatement> mappedStatements = new StrictMap("Mapped Statements collection") .conflictMessageProducer((savedValue, targetValue) -> ". please check " + savedValue.getResource() + " and " + targetValue.getResource());針對 xml 文件的解析,都是解析 標簽,然后根據解析信息構建對應的 Java 對象,最終把這些數據填充到 Configuration 對象屬性中。
更多解析細節,自行翻閱相關源碼
mapper class 綁定 xml 文件數據時,同時解析注解
在 mybatis 中,除了能夠在 xml 文件中配置數據,如:sql數據通過 等標簽,緩存通過 標簽進行配置,同樣的這些配置信息也支持有注解配置,該注解配置可以配置在相應的 mapper class 文件中。
來看一個 mapper class 的文件定義,代碼如下:
如上述代碼 @Select 對應的xml文件中的 ,@CacheNamespace 對應 xml 文件中的
更多配置,參考 mybatis 官網,或者 mybatis 源碼
從語義上來說,注解配置和xml配置并沒有區別,區別在于聲明的方式,一個 xml 標簽,一個java代碼注解
區別還在于解析構建類的不同,xml 解析在 XMLStatementBuilder 中完成,注解解析在 MapperAnnotationBuilder 中完成。
來看一下注解解析代碼 MapperAnnotationBuilder#parse
如上述代碼,通過解析注解完成相關配置信息的讀取,如:緩存配置,SQL等。
同樣的相關解析后的數據和 xml 解析后的數據一樣,并存儲在 Configuration 對應的容器中。
總結
xml 文件關于 sql 的解析或者標簽的解析和 mapper class 關于注解式sql等解析方式不同。
xml 中關于 sql 的解析,在 XMLStatementBuilder 中完成。
mapper class 中關于 sql 的解析在 MapperAnnotationBuilder 中完成。
雖然 xml 和 注解的配置形式不同,但是他們所表達語義是相同的,解析后對應的 java 對象結構也是相同,這些解析數據,會被存放在 Configuration 對象中。
標簽解析完 xml 文件和關聯的 mapper class 文件后,Mybaits 中 Configuration 對象內容如下:
End
總結
以上是生活随笔為你收集整理的sql server解析xml属性为表格_[Mybatis][基础支持层]mapper xml sql 解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: session.merge 缓存不更新_
- 下一篇: python如何安装scrapy_Pyt