1. 程式人生 > 實用技巧 >結果集對映體系一

結果集對映體系一

結果集對映體系一

前言

本章你將學會MetaObject的使用與原理,以及巢狀子查詢原理,包括子查詢當中的迴圈依賴

對映工具MetaObject

所謂對映是指結果集中的列填充至JAVA Bean屬性。這就必須用到反射,而Bean的屬性 多種多樣的有普通屬性、物件、集合、Map都有可能。為了更加方便的操作Bean的屬性,MyBatis提供了MeataObject 工具類,其簡化了物件屬性的操作。其具體功能如下:

  1. 查詢屬性:勿略大小寫,支援駝峰、支援子屬性 如:“blog.comment.user_name”

  2. 獲取屬性

    1. 基於點獲取子屬性 “user.name”

    2. 基於索引獲取列表值 “users[1].id”

    3. 基於key獲取map值 “user[name]”

  3. 設定屬性:

    1. 可設定子屬性值

    2. 支援自動建立子屬性(必須帶有空參構造方法,且不能是集合)

為了實現上述功能,MetaObject 相繼依賴了BeanWrapper、MetaClass、Reflector。這四個物件關係如下:

  • BeanWrapper: 功能與MeataObject類似,不同點是BeanWrapper只針對單個當前物件屬性進行操作,不能操作子屬性。

  • MetaClass:類的反射功能支援,獲能獲取整完整類的屬性,包括屬性的屬性。

  • Reflector:類的反射功能支援,僅支援當前類的屬性。

Meata獲取屬性流程:

物件結構如下圖:

獲取部落格的第一個評論者的名稱,其獲取表達示是:

"comments[0].user.name"

MetaObjbt 解析獲取流程如下圖:

流程中方法說明:

MeataObject.getValue()

獲取值的入品,首先根據屬性名"comments[0].user.name" 解析成PropertyTokenizer,並基於屬性中的“.” 來判斷是否為子屬性值,如果是就遞迴呼叫getValue()獲取子屬性物件。然後在遞迴呼叫getValue()獲取子屬性下的屬性。直到最後的name屬性獲。

MeataObject.setValue()

流程與getValue()類似,不同在於如果子屬性不存在,則會嘗試建立子屬性。

ResultMap結果集對映

對映是指返回的ResultSet列與Java Bean 屬性之間的對應關係。通過ResultMapping進行對映描述,在用ResultMap封裝成一個整體。

對映設定

一個ResultMap 中包含多個ResultMapping 表示一個具體的JAVA屬性到列的對映,其主要值如下:

ResultMapping 有多種表現形式如下:

  1. constructor:構建引數欄位

  2. id:ID欄位

  3. result:普通結構集欄位

  4. association:1對1關聯欄位

  5. Collection:1對多集合關聯欄位

自動對映

當前列名和屬性名相同的情況下,可使用自動對映

自動對映條件

  1. 列名和屬性名同時存在(勿略大小寫)

  2. 當前列未手動設定對映

  3. 屬性類別存在TypeHandler

  4. 開啟autoMapping (預設開啟)

巢狀子查詢

但很多時候物件結構, 是樹級程現的。即物件中包含物件。可以通過子查詢獲取子物件屬性。

當依次解析Blog中的屬性時,會先解析填充普通屬性,當解析到複合物件時,就會觸發對子查詢。

子查詢迴圈依賴