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咖啡屋
每天更新各種技術學習心得體會

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章