首页 > 其他 > 详细

MyBatis从入门到精通(第6章):MyBatis 高级查询->6.1.2高级结果映射之一对多映射

时间:2020-01-12 16:20:13      阅读:86      评论:0      收藏:0      [点我收藏+]

jdk1.8、MyBatis3.4.6、MySQL数据库5.6.45、IntelliJ IDEA 2019.3.1

本章主要包含的内容为 MyBatis 的高级结果映射,主要处理数据库一对一、一对多的查询,另外就是在 MyBatis 中使用存储过程的方法,处理存储过程的入参和出参方法,最后会介绍 Java 中的枚举方法和数据库表字段的处理方法

6.1 高级结果映射 


在关系型数据库中,我们经常要处理一对一、一对多的关系

在 RBAC 权限系统中还存在着一个用户拥有多个角色、一个角色拥有多个权限这样复杂的嵌套关系。使用已经学会的 MyBatis 技巧都可以轻松地解决这种复杂的关系。在面对这种关系的时候,我们可能要写多个方法分别查询这些数据,然后再组合到一起。这种处理方式特别适合用在大型系统上,由于分库分表,这种用法可以减少表之间的关联查询,方便系统进行扩展。 

但是在一般的企业级应用中,使用 MyBatis 的高级结果映射便可以轻松地处理这种一对一、一对多的关系


 

一对多映射只有两种配置方式,都是使用 collection 标签进行的,下面来看具体的介绍

在 RBAC 权限系统中,一个用户拥有多个角色(注意,使用association 是设定的特例,限制一个用户只有一个角色,每个角色又是多个权限的集合,所以要渐进式地去实现一个 SQL,查询出所有用户和用户拥有的角色,以及角色所包含的所有权限信息的两层嵌套结果

先来看如何实现一层嵌套的结果,为了能够存储一对多的数据,先对 SysUser 类进行修改,代码如下

技术分享图片

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

在 UserMapper.xml 中创建 resultMap ,代码如下

技术分享图片

和 6.1.1.3 中的方式对比会很容易发现,此处就是把 association 改成了 collection ,然后将 property 设置为了 roleList,其他的 id 和 result 的配置都还一样。仔细想想应该不难理解collection 用于配置一对多关系,对应的属性必须是对象中的集合类型,因此这里是 roleList。另外resultMap 只是为了配置数据库字段和实体属性的映射关系,因此其他都一样。同时能存储一对多的数据结构肯定也能存储一对一关系,所以一对一像是一对多的一种特例collection 支持的属性以及属性的作用和association 完全相同

上一节中,我们逐步对 resultMap 进行了简化,在这一节,因为有了上一节的基础,因此可以大刀阔斧地对这个 resultMap 进行快速简化。首先,SysUser 中的属性可以直接通过继承 userMap 来使用 sys_user 的映射关系,其次在 RoleMapper.xml 中的 roleMap 映射包含了 sys_role 的映射关系,因此可以直接引用 roleMap,经过这两个方式的简化,最终的userRoleListMap 如下

 技术分享图片

仿照上一节的 selectUserAndRoleById 2 方法,创建selectAllUserAndRoles 方法,代码如下

技术分享图片

这个方法用于查询所有用户及其对应的角色,sys_role 对应的查询列都增加了以“role_”作为前缀的别名

在 UserMapper 接口中增加如下的对应方法

    /**
     * 获取所有的用户以及对应的所有角色
     * 
     * @return
     */
    List<SysUser> selectAllUserAndRoles();

针对该方法,在 UserMapperTest 中添加如下测试

技术分享图片

从上图已经可以看到,第一个用户拥有两个角色,实现了一对多的查询。再来看一下测试代码输出的日志

技术分享图片

技术分享图片

通过日志可以清楚地看到,SQL 执行的结果数有 3 条,后面输出的用户数是 2,也就是说本来查询出的 3 条结果经过 MyBatis 对 collection 数据的处理后,变成了两条

 技术分享图片

 

 

 

 

 

 

 

===========================================================

end

MyBatis从入门到精通(第6章):MyBatis 高级查询->6.1.2高级结果映射之一对多映射

原文:https://www.cnblogs.com/MarlonKang/p/12182802.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!