1. 程式人生 > >Mybatis學習第四彈

Mybatis學習第四彈

今天主要談談 Mybatis 中對查詢的結果集封裝規則的學習。

通常來說,對於 POJO 我們只需要使用 resultMap 標籤對查詢的結果集進行封裝簡單即可,使用 id 子標籤封裝主鍵查詢結果,使用 result 子標籤封裝其他列查詢結果,使用 result 封裝主鍵,但是不推薦這樣做,因為

id 子標籤對主鍵的封裝會進行底層優化;其中,使用 column 屬性指定查詢的列名,使用property 屬性指定類的屬性名

除此之外,我們通常會遇到一些比較複雜的情況,比如:

1、類的屬性是一個 java 物件且查詢語句如果採用聯合查詢,就需要一些特殊的處理才能封裝結果集,比如可以指定 result 標籤的 property 屬性為『a.b』,採用級聯屬性的方式封裝結果集;也可以使用 resultMap 的association 子標籤來封裝物件屬性,其中 property 屬性指定屬性名,javaType 屬性指定物件所屬的類的全類名且必須指定。

2、類的屬性是一個 java 物件且使用分步查詢,此時同樣使用 association 標籤來定義封裝規則,其中 property 屬性指定屬性名,select 屬性指定下一步查詢語句所在的名稱空間及 id ,column 屬性指定將哪一列的值傳遞給下一步查詢語句。

3、類的屬性是一個集合型別元素且採用聯合查詢,此時使用 resultMap 的 collection 子標籤定義封裝集合類屬性的規則,其中 property 屬性指定集合屬性名,ofType 指定集合型別元素所屬類的全類名,然後在 collection 標籤中使用 id 和 result 標籤正常定義封裝規則即可。

4、同上2,也可以採用分步查詢並定義相應的封裝規則,此時 collection 的property 標籤指定集合屬性名,select 屬性指定集合型別元素所屬類的全類名,column 屬性指定將某列的值傳遞給下一查詢語句,同時不需要再在collection 標籤中在定義封裝規則。

5、分步查詢時如果需要將多列的值傳遞到下一個查詢語句,可以採用封裝 map 的方式,例如 column = “{key1=column1,key2=column2}”。

6、association 標籤和 collection 標籤中都有 fetchType 屬性,可以設定值為 lazy(延遲)和 eager(立即)來開啟和關閉延遲載入功能,且該屬性會覆蓋 Mybatis 的全域性設定。

tip:如果需要根據查詢得到的某一列的值改變結果集的對映行為,可以使用 discriminator 標籤,其中 javaType 必須指定為對應屬性的java 型別,column 指定為列名;在子標籤 case 中,value 屬性指定為需要鑑別的值,resultType 指定為結果集封裝的類名;case 標籤中定義的封裝規則將會與上一級封裝規則合併並且取最新的規則。

關注微信公眾號:Javall咖啡屋 每天更新各種技術學習心得體會