當前位置:編程學習大全網 - 源碼下載 - resultMap完美解析(含github實例)

resultMap完美解析(含github實例)

在 select 語句中查詢得到的是壹張二維表, 水平方向上看是壹個個字段, 垂直方向上看是壹條條記錄。作為面向對象的語言, Java 中的的對象是根據類定義創建的。 類之間的引用關系可以認為是嵌套的關系。

在 mybatis 中, resultMap 節點定義了結果集和結果對象(JavaBean)之間的映射規則。

本文主要講解的是 resultMap 的解析。

兩個基礎類

在閱讀本文之前, 最好能對這兩個類有相應的理解。

1.1、列映射類ResultMapping

ResultMapping 對象記錄了結果集中壹列與隊友JavaBean中壹個 屬性的對應關系

解析

2.1、入口函數

resultMap 是 mapper.xml 文件下的, 因此其是解析 Mapper 的壹個環節。

解析, 由於是可以有多個的, 因此, context.evalNodes("/mapper/resultMap")返回的是壹個 List。

2.2、整個過程就是 resultMapElement 這個函數。

其流程大體如下:

對應的代碼

2.3、獲取 id

id 對於 resultMap 來說是很重要的, 它是壹個身份標識。 具有唯壹性

這裏涉及到 XNode 對象中的兩個函數

該函數是獲取 XNode 對象對應 XML 節點的 name 屬性值, 如果該屬性不存在, 則返回傳入的默認值 def。

而在獲取 id 的過程中, 默認值是下面這個函數

該函數是生成元素節點的id, 如果是這樣子的 XML。

我們調用

則, 返回值應該是

2.4、解析結果集的類型

結果集的類型, 對應的是壹個 JavaBean 對象。 通過反射來獲得該類型。

看源碼, 有很多個 def 值, 也就是說, 我們在配置結果集的類型的時候都是有優先級的。 但是, 這裏有壹個奇怪的地方, 我源代碼版本(3.5.0-SNAPSHOT)的 的屬性, 只有 type, 沒有 ofType/resultType/javaType。 以下為相應的 DTD 約束:

我懷疑是兼容以前的版本。

2.5、獲取繼承結果集和自動映射

這個兩個屬性都是在配置 XML 的時候可有可無的。

2.6、解析

先看 DTD 約束

可以有以下幾個子節點:

根據類型進行解析, 最後獲得 resultMappings

除了 discriminator 節點, 其余節點最後都會回到 buildResultMappingFromContext 方法上, 該方法是創建 ResultMapping 對象。

如果是 discriminator, 則處理該元素並創建鑒別器。

鑒別器內部, 也是含有 ResultMapping 的

2.7、創建 ResultMap 對象

在解析完 的各個屬性和子節點之後。 創建 ResultMapResolver 對象, 通過對象可以生成 ResultMap。

解析結果

有如下的數據庫表

通過代碼生成器生成 XML 和 Mapper。

添加結果集

對應的 sql

則最後解析出的結果

  • 上一篇:Axure怎麽畫出微信APP導航原型圖?
  • 下一篇:條形碼分類?
  • copyright 2024編程學習大全網