查询优化:查询明细时,将主表id分离出来变成单独的list集合,使用in查询明细数据而不是使用单纯的循环查询,以减少对数据库的访问,减轻数据库负担

我们在查询数据时,经常需要在查出主数据的同时,还需查出来与之关联的明细数据.实体类类似这样:

 这样的话,首先需要查询出来主表数据,然后根据id,再去查明细表数据,一般情况下做法都是这样的:

        虽然也可以实现功能,但是如果数据量很大,或者有很多用户同时操作,并发量大,数据库很容易就寄了,因此我们需要换一种思路,可以先把主表数据的id提取成一个list集合,然后使用list集合把明细数据一次全部查出来,然后放到一个list集合中,然后我们定义一个Map,Map的key是主表id,value就是对应的明细表数据,这时候再次遍历主表,只需要根据主表id去getMap的value就可以获取到相对应的明细数据.这么一大堆,看的头晕眼花,我们直接看代码:

        如果主表数据为10条,本来需要访问数据库1+10次,但是现在只需要访问1+1次即可,大大减轻了数据库的压力.最后,附上代码;

  //主表数据查询
  List<InventoryModel> list = inventoryCrudBiz.getBaseMapper().selectInventoryList(model, (pageNo - 1) * pageSize, pageSize, sql);

  //将主表id放到list集合中
  List<String> idsList = new ArrayList<>();
  list.forEach(inventory -> {
            idsList.add(inventory.getId());
  });

  //根据主表id的list集合去查询明细数据
  List<InventoryItemModel> itemModels = inventoryCrudBiz.getBaseMapper().selectItemByInventoryIds(idsList);

  //将查询到的数据放入map中,其中key是主表id,value是相对应的明细表
  //Collectors.groupingBy()方法将括号中的式子作为条件进行分组
  Map<String, List<InventoryItemModel>> map = itemModels.stream().collect(Collectors.groupingBy(InventoryItemModel::getInventoryId));

  //把分好组的明细数据赋值到主表中
  list.forEach(inventory ->{
          inventory.setInventoryItemModelList(map.get(inventory.getId()));
  });

大功告成,查询出的数据也没有错误,可能还有其他更好的方法和改进点,恭听各位大佬指点

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值