前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MyBatis处理一对多关系时的性能考虑

MyBatis处理一对多关系时的性能考虑

原创
作者头像
code-x
修改2022-08-17 14:58:08
6830
修改2022-08-17 14:58:08
举报
文章被收录于专栏:code-xcode-x

Mybatis框架对于处理一对多的情况有两种方法

  1. 查询的时候JOIN子表, 然后交给MyBatis拼装数据
  2. 查询的时候不JOIN子表, 主表查询完成后发起select再查询关联表数据, 还可以配置fetchType=lazy进行懒加载

这两种方法各有问题:

  1. 第一种方案有两个缺陷: 1) 做分页查询的时候不准, 2) 如果关联子表多, 结果集会非常大, 占用网络IO
  2. 第二种方案会出现1+N次查询, 发起的sql数量会非常恐怖. 懒加载如果最后转JSON, 那么同样是1+N次查询

建议开发自己去拼装一对多的集合

处理的办法是:

把主表的关联字段手动放进一个集合, 发起in查询把关联表的数据查询出来, 然后手动拼装, 这样发起的查询数量就是1+1

常见做法就是lambda将实体集合转为id集合, 发起in查询, 再用lambda分组, 最后进行对应

如:

代码语言:javascript
复制
Page<OrderInfoDTO> page = orderMapper.selectPage();
List<String> collect = page.getRecords().stream().map(OrderInfoDTO::getFileBatchCode)
               .collect(Collectors.toList());

if (ObjectUtil.isNotEmpty(collect)) {
   Map<String, List<FilePO>> map = fileMapper.selectList(new QueryWrapper<FilePO>()
                           .in("code", collect))
                           
           .stream().collect(Collectors.groupingBy(FilePO::getBatchCode));

   page.getRecords().forEach(item -> item.setFileList(map.get(item.getFileBatchCode())));
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档