Mybatis高级查询之一对多查询的两种方法(笔记)
2.1 使用collection嵌套结果映射
- 假设如下场景,一个用户有多个角色,一个角色有多个权限。
2.1.1 与一对一查询的区别
- 区别:只是把association改成了colection,并且property属性的值改为了roleList,这里很好理解因为一对多,多端肯定是以集合来存储的。
- 简化写法
- 接下来看查询方法如何写
- 接下来设测试(略),设置断点查看如下
- 我们查出来两个用户,第一个用户有两个角色。
- 接下来看输出日志
2.1.2 结果自动合并的情况
- SQL执行结果三条但是用户数最后却只有两个,也就是说collection处理后变成了两条。因为第一个用户又拥有两个角色,经过转换为一对多数据结构后就变成了两个,毋庸置疑的。理解这个转换过程至关重要。
- 为什么会自动合并用户1的两条查询结果呢?因为用户表是通过ID来判断用户是否相同的。所以MyBatis合并的依据是在
在resultMap中配置了ID字段。如下图所示: - 一种极端的情况:如果我们没有在resultMap中配置id,那么mybatis就会把resultMap中所有的字段逐一比较,如果全部相同则合并,存在一个不同不合并。
- 另一种极端情况我们resultMap中配置了ID,但是在查询语句中没有查询ID列,这时候就会导致嵌套集合只有一条数据。很好解释,因为没有查询ID所以导致对应的ID值为NULL,所以mybatis在比较的时候是根据ID来比较都是NULL所以合并成一条数据。
- 下面我们继续,一个角色对应多个权限。增加如下
- 说明
- 上面省略了权限实体类。
- 其次xml文件配置简易图示如下。
- 注意别名
2.2 使用Collection集合的嵌套查询
对比:我们在一对一查询的时候使用association的关联嵌套查询,分为主查询和从查询,所以配置的时候很简单。在一对多中Collection也存在嵌套查询。
- 首先我们在privilegeMapper.xml中加入下面方法,用来根据角色ID来查询用户所属权限。
- 然后我们roleMapper.xml ,我们可以看到colection标签中,与当初配置一对一association嵌套查询一致,增加了column、select属性。
- 同时我们增加一个查询方法用于根据用户ID查询用户的角色。
-然后我们配置顶层userMapper.xml - 一对多的嵌套查询和一对一的嵌套查询一致,只不过用了不同的标签,有些配置可以参考一对一嵌套查询。