Mybatis高級查詢之一對多查詢的兩種方法(筆記)

2.1 使用collection嵌套結果映射

  • 假設如下場景,一個用戶有多個角色,一個角色有多個權限。
    enter description here
    enter description here

2.1.1 與一對一查詢的區別

  • 區別:只是把association改成了colection,並且property屬性的值改爲了roleList,這裏很好理解因爲一對多,多端肯定是以集合來存儲的。
  • 簡化寫法
    enter description here
  • 接下來看查詢方法如何寫
    enter description here
  • 接下來設測試(略),設置斷點查看如下
    enter description here
  • 我們查出來兩個用戶,第一個用戶有兩個角色。
  • 接下來看輸出日誌
    enter description here

2.1.2 結果自動合併的情況

  • SQL執行結果三條但是用戶數最後卻只有兩個,也就是說collection處理後變成了兩條。因爲第一個用戶又擁有兩個角色,經過轉換爲一對多數據結構後就變成了兩個,毋庸置疑的。理解這個轉換過程至關重要。
  • 爲什麼會自動合併用戶1的兩條查詢結果呢?因爲用戶表是通過ID來判斷用戶是否相同的。所以MyBatis合併的依據是在
    在resultMap中配置了ID字段。如下圖所示:enter description here
  • 一種極端的情況:如果我們沒有在resultMap中配置id,那麼mybatis就會把resultMap中所有的字段逐一比較,如果全部相同則合併存在一個不同不合並
  • 另一種極端情況我們resultMap中配置了ID,但是在查詢語句中沒有查詢ID列,這時候就會導致嵌套集合只有一條數據。很好解釋,因爲沒有查詢ID所以導致對應的ID值爲NULL,所以mybatis在比較的時候是根據ID來比較都是NULL所以合併成一條數據。
  • 下面我們繼續,一個角色對應多個權限。增加如下
    enter description here
    enter description here
    enter description here
  • 說明
  • 上面省略了權限實體類。
  • 其次xml文件配置簡易圖示如下。
    enter description here
    enter description here
  • 注意別名

2.2 使用Collection集合的嵌套查詢

對比:我們在一對一查詢的時候使用association的關聯嵌套查詢,分爲主查詢和從查詢,所以配置的時候很簡單。在一對多中Collection也存在嵌套查詢。

  • 首先我們在privilegeMapper.xml中加入下面方法,用來根據角色ID來查詢用戶所屬權限。
    enter description here
  • 然後我們roleMapper.xml ,我們可以看到colection標籤中,與當初配置一對一association嵌套查詢一致,增加了column、select屬性。
    enter description here
  • 同時我們增加一個查詢方法用於根據用戶ID查詢用戶的角色。
    enter description here
    -然後我們配置頂層userMapper.xml
    enter description here
  • 一對多的嵌套查詢和一對一的嵌套查詢一致,只不過用了不同的標籤,有些配置可以參考一對一嵌套查詢。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章