2.1 使用collection嵌套結果映射
- 假設如下場景,一個用戶有多個角色,一個角色有多個權限。
2.1.1 與一對一查詢的區別
- 區別:只是把association改成了colection,並且property屬性的值改爲了roleList,這裏很好理解因爲一對多,多端肯定是以集合來存儲的。
- 簡化寫法
- 接下來看查詢方法如何寫
- 接下來設測試(略),設置斷點查看如下
- 我們查出來兩個用戶,第一個用戶有兩個角色。
- 接下來看輸出日誌
2.1.2 結果自動合併的情況
- SQL執行結果三條但是用戶數最後卻只有兩個,也就是說collection處理後變成了兩條。因爲第一個用戶又擁有兩個角色,經過轉換爲一對多數據結構後就變成了兩個,毋庸置疑的。理解這個轉換過程至關重要。
- 爲什麼會自動合併用戶1的兩條查詢結果呢?因爲用戶表是通過ID來判斷用戶是否相同的。所以MyBatis合併的依據是在
在resultMap中配置了ID字段。如下圖所示: - 一種極端的情況:如果我們沒有在resultMap中配置id,那麼mybatis就會把resultMap中所有的字段逐一比較,如果全部相同則合併,存在一個不同不合並。
- 另一種極端情況我們resultMap中配置了ID,但是在查詢語句中沒有查詢ID列,這時候就會導致嵌套集合只有一條數據。很好解釋,因爲沒有查詢ID所以導致對應的ID值爲NULL,所以mybatis在比較的時候是根據ID來比較都是NULL所以合併成一條數據。
- 下面我們繼續,一個角色對應多個權限。增加如下
- 說明
- 上面省略了權限實體類。
- 其次xml文件配置簡易圖示如下。
- 注意別名
2.2 使用Collection集合的嵌套查詢
對比:我們在一對一查詢的時候使用association的關聯嵌套查詢,分爲主查詢和從查詢,所以配置的時候很簡單。在一對多中Collection也存在嵌套查詢。
- 首先我們在privilegeMapper.xml中加入下面方法,用來根據角色ID來查詢用戶所屬權限。
- 然後我們roleMapper.xml ,我們可以看到colection標籤中,與當初配置一對一association嵌套查詢一致,增加了column、select屬性。
- 同時我們增加一個查詢方法用於根據用戶ID查詢用戶的角色。
-然後我們配置頂層userMapper.xml
- 一對多的嵌套查詢和一對一的嵌套查詢一致,只不過用了不同的標籤,有些配置可以參考一對一嵌套查詢。