mybatis記錄隨便(五)一對多映射實現方式


上一節繼續一對多的實現。上節為了介紹一對一映射,規定一個用戶只能對應一個角色,其實在實際的RBAC權限系統中,一個用戶往往對應多個角色,然后每個角色用對應多個權限,基於實際需求,現在通過用戶-角色-權限這種一對多的關系來說明一對多映射實現方式。

一、collection 集合的嵌套結果映射

和association類似,集合的嵌套結果映射就是指通過一次 SQL 查詢將所有的結果查詢出來,然后通過配置的結果映射,將數據映射到不同的對象中去 。

在SysUser類中增加 List<SysRole> roleList 屬性用於存儲用戶對應的多個角色。

SysUser.java

 

在UserMapper.xml創建resultMap

 

與上一節一對一映射相比其實就是把association標簽替換為collection。

所以基於對association優化,同理也可以對collection進行優化,如下

UserMapper.xml

 

RoleMapper.xml

可以仿照上一節對於一對一映射查詢,在UserMapper.xml添加select查詢,如下

所有和角色相關的查詢屬性都添加了“role_”作為前綴列名。

UserMapper.java配置對應接口,如下

 

至此,當前查詢配置完成,可以通過selectAllUserAndRoles進行查詢。

 

二、collection 集合的多級嵌套映射

當前操作用戶-角色之間一對多映射,同時角色和資源之間還是會存在一對多的映射關系,這就牽扯到多級關系映射查詢。

假設角色和資源也是一對多的關系映射,具體資源表信息如下

序號 表名 對應實體 對應數據庫接口 對應mapper 備注
1 sys_privilege  SysPrivilege 
PrivilegeMapper.java
PrivilegeMapper.xml
資源表

 

 PrivilegeMapper.xml添加resultMap配置

在SysRole.java添加對應的List<SysPrivilege> privilegeList。

在RoleMapper.xml添加resultMap配置如下

創建角色權限映射,繼承基礎的roleMap,其嵌套了privilegeList屬性,直接使用PrivilegeMapper.xml里的privilegeMap。

修改UserMapper.xml

 

 

在UserMapper.java添加對應接口,如下

兩層嵌套完成,測試當前接口可以查詢到用戶-角色-資源信息。

【說明】這里要特別注意 sys_privilege 表中列的別名,因為 sys_privilege 嵌套在rolePrivilegeListMap 中,而 rolePrivilegeListMap 的前綴是“ role ”,所以rolePrivilegeListMap 中 privilegeMap 的前綴就變成了“ role_privilege一飛在嵌套中,這個前綴需要疊加, 一定不要寫錯。

 三、collection 集合的嵌套查詢

PrivilegeMapper.xml添加映射和對應查詢方法

 RoleMapper.xml添加映射和對應查詢方法

【說明】在上面代碼中要注意 column 屬性配置的{ roleId=id}, roleId 是 select 指定方法selectPrivilegeByRoleId 查詢中的參數, id 是當前查詢 selectRoleByUserid 中查詢出的角色 id 。 

修改UserMapper.xml

 

最后在UserMapper.java添加查詢接口即可,如下

List<SysUser> selectAllUserAndRolesSelect(Long id);

至此,完成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM