自已如何做网站,品牌营销型网站建设公司,小众做的好的网站,广州网站建设费用多少在我们的日常开发中#xff0c;经常会使用到批量insert/update的语句来实现相关的业务功能。而如果数据量比较大的话#xff0c;会导致sql语句更新失败、抛出异常的情况出现。这个时候我们可以批量执行sql语句#xff0c;一批一批的执行。 比如说现在有一个需要批量修改商品… 在我们的日常开发中经常会使用到批量insert/update的语句来实现相关的业务功能。而如果数据量比较大的话会导致sql语句更新失败、抛出异常的情况出现。这个时候我们可以批量执行sql语句一批一批的执行。 比如说现在有一个需要批量修改商品的方法我们可以这么改造
public void batchUpdateById(ListProduct productList) {if (CollectionUtils.isEmpty(productList)) {return;}if (productList.size() CommonUtils.BATCH_NUMBER) {int sizeNum productList.size();int startNum 0;int endNum CommonUtils.BATCH_NUMBER - 1;while (startNum endNum) {productMapper.batchUpdateById(productList.subList(startNum, endNum));startNum CommonUtils.BATCH_NUMBER - 1;endNum CommonUtils.BATCH_NUMBER - 1;if (endNum sizeNum - 1) {endNum sizeNum;}}} else {productMapper.batchUpdateById(productList);}
} 上面BATCH_NUMBER的值是50意味着当修改商品的数量大于50的时候会以50个数据为一批分批的执行而如果修改商品的数量不大于50的时候就直接一次执行就够了。 上面是我们自己手写的分批代码而如果每个方法都这么写也未免太过于繁琐了。这个时候我们就可以使用guava库中关于集合的partition分组方法来进行简化
Override
public void batchUpdateById(ListGoodsSkuBO list) {if (CollectionUtils.isEmpty(list)) {return;}ListMerchantGoodsSkuDO merchantGoodsSkuDOS GoodsAnotherSkuConvertor.INSTANCE.goodsSkuBO2MerchantDOList(list);ListListMerchantGoodsSkuDO groupMerchantGoodsSkuDOS Lists.partition(merchantGoodsSkuDOS, CommonUtils.BATCH_NUMBER);groupMerchantGoodsSkuDOS.forEach(goodsSkuMasterMapper::batchUpdateById);
} 由上可以看到代码简化了很多上面的goodsSkuBO2MerchantDOList方法只是将BO转成DO和分组逻辑没有关系。而对于批量查询的方法我们也可以使用partition方法进行分组查询防止in条件拼接太多的数据导致sql报错的情况出现
Override
public ListGoodsSkuBO listBySpuIdsSimple(ListLong spuIds) {if (CollectionUtils.isEmpty(spuIds)) {return Collections.emptyList();}//去重spuIds spuIds.stream().distinct().collect(Collectors.toList());ListListLong groupSpuIds Lists.partition(spuIds, CommonUtils.BATCH_NUMBER);ListMerchantGoodsSkuDO spuIdList groupSpuIds.stream().map(goodsSkuMasterMapper::listBySpuIds).flatMap(Collection::stream).collect(Collectors.toList());return GoodsAnotherSkuConvertor.INSTANCE.merchantGoodsSkuDO2GoodsSkuBOList(spuIdList);
}