java map一对多映射_mybatis记录随便(五)一对多映射实现方式

本文详细介绍了如何在MyBatis中实现Java Map的一对多映射,包括集合的嵌套结果映射、多级嵌套映射以及嵌套查询。通过用户-角色-权限的关系举例,展示了从SQL查询到结果映射配置的全过程,强调了在配置过程中列别名的叠加规则和查询方法中column属性的正确设置。
摘要由CSDN通过智能技术生成

接上一节继续一对多的实现。上节为了介绍一对一映射,规定一个用户只能对应一个角色,其实在实际的RBAC权限系统中,一个用户往往对应多个角色,然后每个角色用对应多个权限,基于实际需求,现在通过用户-角色-权限这种一对多的关系来说明一对多映射实现方式。

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

和association类似,集合的嵌套结果映射就是指通过一次 SQL 查询将所有的结果查询出来,然后通过配置的结果映射,将数据映射到不同的对象中去 。

在SysUser类中增加 List roleList 属性用于存储用户对应的多个角色。

SysUser.java

2f0303da0d6afa21d4ab1f22bb6e5b12.png

在UserMapper.xml创建resultMap

aa5b89aea2642cc1b19244fb8691823a.png

与上一节一对一映射相比其实就是把association标签替换为collection。

所以基于对association优化,同理也可以对collection进行优化,如下

UserMapper.xml

c74c1d86e047155bf7ae253ee3ee90f2.png

RoleMapper.xml

4522cdfa28d65c60eec38bd8ae78435c.png

可以仿照上一节对于一对一映射查询,在UserMapper.xml添加select查询,如下

dfd540def8c3b7aa7a8f21572927f838.png

所有和角色相关的查询属性都添加了“role_”作为前缀列名。

UserMapper.java配置对应接口,如下

83f3c9d479e6e18e823b5a5844265e80.png

至此,当前查询配置完成,可以通过selectAllUserAndRoles进行查询。

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

当前操作用户-角色之间一对多映射,同时角色和资源之间还是会存在一对多的映射关系,这就牵扯到多级关系映射查询。

假设角色和资源也是一对多的关系映射,具体资源表信息如下

序号

表名

对应实体

对应数据库接口

对应mapper

备注

1

sys_privilege

SysPrivilege

PrivilegeMapper.java

PrivilegeMapper.xml

资源表

PrivilegeMapper.xml添加resultMap配置

a36de832d4f1bcb9bfeb65bf6d99e8dd.png

在SysRole.java添加对应的List privilegeList。

8b7d83012596437afb82dea6cb2c461a.png

在RoleMapper.xml添加resultMap配置如下

8d3fa06b075aca00b8442d3205b7fc39.png

创建角色权限映射,继承基础的roleMap,其嵌套了privilegeList属性,直接使用PrivilegeMapper.xml里的privilegeMap。

修改UserMapper.xml

bce793a24c0f9cce0bd56c216a233b98.png

在UserMapper.java添加对应接口,如下

b986d9740a9a6ad4143082f304b33f40.png

两层嵌套完成,测试当前接口可以查询到用户-角色-资源信息。

【说明】这里要特别注意 sys_privilege 表中列的别名,因为 sys_privilege 嵌套在rolePrivilegeListMap 中,而 rolePrivilegeListMap 的前缀是“ role ”,所以rolePrivilegeListMap 中 privilegeMap 的前缀就变成了“ role_privilege一飞在嵌套中,这个前缀需要叠加, 一定不要写错。

三、collection 集合的嵌套查询

PrivilegeMapper.xml添加映射和对应查询方法

ac66718a6790841774f2816bd1e81e98.png

RoleMapper.xml添加映射和对应查询方法

422796bbf1381dd1b77b44b7a854a508.png

【说明】在上面代码中要注意 column 属性配置的{ roleId=id}, roleId 是 select 指定方法selectPrivilegeByRoleId 查询中的参数, id 是当前查询 selectRoleByUserid 中查询出的角色 id 。

修改UserMapper.xml

49f8e1e31f5929713774a4fbc00d7e00.png

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

List selectAllUserAndRolesSelect(Long id);

至此,完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值