jdk1.8、MyBatis3.4.6、MySQL数据库5.6.45、IntelliJ IDEA 2019.3.1
本章主要包含的内容为 MyBatis 的高级结果映射,主要处理数据库一对一、一对多的查询,另外就是在 MyBatis 中使用存储过程的方法,处理存储过程的入参和出参方法,最后会介绍 Java 中的枚举方法和数据库表字段的处理方法。
在关系型数据库中,我们经常要处理一对一、一对多的关系。
在 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