接上一節繼續一對多的實現。上節為了介紹一對一映射,規定一個用戶只能對應一個角色,其實在實際的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);
至此,完成。