結果集對映體系一
結果集對映體系一
前言
本章你將學會MetaObject的使用與原理,以及巢狀子查詢原理,包括子查詢當中的迴圈依賴
對映工具MetaObject
所謂對映是指結果集中的列填充至JAVA Bean屬性。這就必須用到反射,而Bean的屬性 多種多樣的有普通屬性、物件、集合、Map都有可能。為了更加方便的操作Bean的屬性,MyBatis提供了MeataObject 工具類,其簡化了物件屬性的操作。其具體功能如下:
-
查詢屬性:勿略大小寫,支援駝峰、支援子屬性 如:“blog.comment.user_name”
-
獲取屬性
-
基於點獲取子屬性 “user.name”
-
基於索引獲取列表值 “users[1].id”
-
基於key獲取map值 “user[name]”
-
設定屬性:
-
可設定子屬性值
-
支援自動建立子屬性(必須帶有空參構造方法,且不能是集合)
為了實現上述功能,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 有多種表現形式如下:
-
constructor:構建引數欄位
-
id:ID欄位
-
result:普通結構集欄位
-
association:1對1關聯欄位
-
Collection:1對多集合關聯欄位
自動對映
當前列名和屬性名相同的情況下,可使用自動對映
自動對映條件
-
列名和屬性名同時存在(勿略大小寫)
-
當前列未手動設定對映
-
屬性類別存在TypeHandler
-
開啟autoMapping (預設開啟)
巢狀子查詢
但很多時候物件結構, 是樹級程現的。即物件中包含物件。可以通過子查詢獲取子物件屬性。
當依次解析Blog中的屬性時,會先解析填充普通屬性,當解析到複合物件時,就會觸發對子查詢。