MySQL分批插入/更新數(shù)據(jù)方式
MySQL分批插入/更新數(shù)據(jù)
在我們的日常開發(fā)中,經(jīng)常會使用到批量insert/update的語句來實現(xiàn)相關(guān)的業(yè)務(wù)功能。而如果數(shù)據(jù)量比較大的話,會導(dǎo)致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,意味著當修改商品的數(shù)量大于50的時候,會以50個數(shù)據(jù)為一批,分批的執(zhí)行;而如果修改商品的數(shù)量不大于50的時候,就直接一次執(zhí)行就夠了。
上面是我們自己手寫的分批代碼,而如果每個方法都這么寫,也未免太過于繁瑣了。
這個時候我們就可以使用guava庫中關(guān)于集合的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轉(zhuǎn)成DO,和分組邏輯沒有關(guān)系)。
而對于批量查詢的方法,我們也可以使用partition方法進行分組查詢,防止in條件拼接太多的數(shù)據(jù)導(dǎo)致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);
}總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
win2003服務(wù)器下配置 MySQL 群集(Cluster)的方法
MySQL 群集是 MySQL 適合于分布式計算環(huán)境的高可用、高冗余版本。它采用了 NDB Cluster 存儲引擎,允許在 1 個群集中運行多個 MySQL 服務(wù)器。2010-12-12
MySql優(yōu)化之InnoDB,4GB內(nèi)存,多查詢的my.ini中文配置方案詳解
本文是一個針對 4G 內(nèi)存系統(tǒng)(主要運行只有 InnoDB 表的 MySQL 并使用幾個連接數(shù)執(zhí)行復(fù)雜的查詢)的MySQL配置文件方案2018-03-03
MySQL數(shù)據(jù)庫中CAST與CONVERT函數(shù)實現(xiàn)類型轉(zhuǎn)換的講解
今天小編就為大家分享一篇關(guān)于MySQL數(shù)據(jù)庫中CAST與CONVERT函數(shù)實現(xiàn)類型轉(zhuǎn)換的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03

