MySQL分批插入/更新數據方式
MySQL分批插入/更新數據
在我們的日常開發(fā)中,經常會使用到批量insert/update的語句來實現(xiàn)相關的業(yè)務功能。而如果數據量比較大的話,會導致sql語句更新失敗、拋出異常的情況出現(xiàn)。
這個時候我們可以批量執(zhí)行sql語句,一批一批的執(zhí)行。
比如說現(xiàn)在有一個需要批量修改商品的方法
我們可以這么改造:
public void batchUpdateById(List<Product> 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個數據為一批,分批的執(zhí)行;而如果修改商品的數量不大于50的時候,就直接一次執(zhí)行就夠了。
上面是我們自己手寫的分批代碼,而如果每個方法都這么寫,也未免太過于繁瑣了。
這個時候我們就可以使用guava庫中關于集合的partition分組方法來進行簡化:
@Override public void batchUpdateById(List<GoodsSkuBO> list) { if (CollectionUtils.isEmpty(list)) { return; } List<MerchantGoodsSkuDO> merchantGoodsSkuDOS = GoodsAnotherSkuConvertor.INSTANCE.goodsSkuBO2MerchantDOList(list); List<List<MerchantGoodsSkuDO>> groupMerchantGoodsSkuDOS = Lists.partition(merchantGoodsSkuDOS, CommonUtils.BATCH_NUMBER); groupMerchantGoodsSkuDOS.forEach(goodsSkuMasterMapper::batchUpdateById); }
由上可以看到,代碼簡化了很多
(上面的goodsSkuBO2MerchantDOList方法只是將BO轉成DO,和分組邏輯沒有關系)。
而對于批量查詢的方法,我們也可以使用partition方法進行分組查詢,防止in條件拼接太多的數據導致sql報錯的情況出現(xiàn):
@Override public List<GoodsSkuBO> listBySpuIdsSimple(List<Long> spuIds) { if (CollectionUtils.isEmpty(spuIds)) { return Collections.emptyList(); } //去重 spuIds = spuIds.stream().distinct().collect(Collectors.toList()); List<List<Long>> groupSpuIds = Lists.partition(spuIds, CommonUtils.BATCH_NUMBER); List<MerchantGoodsSkuDO> spuIdList = groupSpuIds.stream().map(goodsSkuMasterMapper::listBySpuIds).flatMap(Collection::stream) .collect(Collectors.toList()); return GoodsAnotherSkuConvertor.INSTANCE.merchantGoodsSkuDO2GoodsSkuBOList(spuIdList); }
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
win2003服務器下配置 MySQL 群集(Cluster)的方法
MySQL 群集是 MySQL 適合于分布式計算環(huán)境的高可用、高冗余版本。它采用了 NDB Cluster 存儲引擎,允許在 1 個群集中運行多個 MySQL 服務器。2010-12-12MySql優(yōu)化之InnoDB,4GB內存,多查詢的my.ini中文配置方案詳解
本文是一個針對 4G 內存系統(tǒng)(主要運行只有 InnoDB 表的 MySQL 并使用幾個連接數執(zhí)行復雜的查詢)的MySQL配置文件方案2018-03-03MySQL數據庫中CAST與CONVERT函數實現(xiàn)類型轉換的講解
今天小編就為大家分享一篇關于MySQL數據庫中CAST與CONVERT函數實現(xiàn)類型轉換的講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03