最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL分批插入/更新數(shù)據(jù)方式

 更新時間:2025年02月07日 14:19:55   作者:天瑕  
文章介紹了如何使用MySQL分批插入/更新數(shù)據(jù),以避免大 SQL 語句導(dǎo)致的更新失敗或拋出異常,通過手寫分批代碼或使用 Guava 庫的 partition 方法,可以簡化批量操作,同時,文章還提到如何使用 partition 方法進行分組查詢

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,意味著當(dāng)修改商品的數(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)文章

  • mysql update語句的用法詳解

    mysql update語句的用法詳解

    本文詳細介紹了,mysql中update語句的用法,系統(tǒng)全面的學(xué)習(xí)下update更新語句的用法,有需要的朋友可以參考下
    2014-08-08
  • 解讀數(shù)據(jù)庫的嵌套查詢的性能問題

    解讀數(shù)據(jù)庫的嵌套查詢的性能問題

    這篇文章主要介紹了解讀數(shù)據(jù)庫的嵌套查詢的性能問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Mysql存儲過程、觸發(fā)器、事件調(diào)度器使用入門指南

    Mysql存儲過程、觸發(fā)器、事件調(diào)度器使用入門指南

    存儲過程(Stored Procedure)是一種在數(shù)據(jù)庫中存儲復(fù)雜程序的數(shù)據(jù)庫對象。為了完成特定功能的SQL語句集,經(jīng)過編譯創(chuàng)建并保存在數(shù)據(jù)庫中,本文給大家介紹Mysql存儲過程、觸發(fā)器、事件調(diào)度器使用入門指南,感興趣的朋友一起看看吧
    2022-01-01
  • 解決MySQL 5.7.9版本sql_mode=only_full_group_by問題

    解決MySQL 5.7.9版本sql_mode=only_full_group_by問題

    這篇文章主要介紹了解決MySQL 5.7.9版本sql_mode=only_full_group_by問題,需要的朋友可以參考下
    2017-05-05
  • Mysql Binlog數(shù)據(jù)查看的方法詳解

    Mysql Binlog數(shù)據(jù)查看的方法詳解

    這篇文章主要介紹了Mysql Binlog數(shù)據(jù)查看的方法詳解,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • Can''t connect to local MySQL through socket ''/tmp/mysql.sock''解決方法

    Can''t connect to local MySQL through socket ''/tmp/mysql.so

    今天小編就為大家分享一篇關(guān)于Can't connect to local MySQL through socket '/tmp/mysql.sock'解決方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 一文分享10個常用的MySQL高級用法

    一文分享10個常用的MySQL高級用法

    MySQL?有很多高級但實用的功能,能讓你的查詢變得更簡潔、更高效,今天分享?10?個我在工作中經(jīng)常使用的?SQL?技巧,不用死記硬背,掌握了就能立刻提升你的數(shù)據(jù)庫操作水平
    2025-12-12
  • MySQL 用戶權(quán)限與安全管理最佳實踐

    MySQL 用戶權(quán)限與安全管理最佳實踐

    MySQL用戶權(quán)限與安全管理是保障數(shù)據(jù)庫系統(tǒng)穩(wěn)定與安全的重要環(huán)節(jié),通過合理設(shè)計權(quán)限模型、使用 GRANT/REVOKE命令管理權(quán)限、實施最小權(quán)限原則以及加強密碼,可以大幅降低數(shù)據(jù)庫被非法訪問和數(shù)據(jù)泄露的風(fēng)險,這篇文章主要介紹了MySQL 用戶權(quán)限與安全管理,需要的朋友可以參考下
    2025-03-03
  • MySQL修改密碼的幾種方式

    MySQL修改密碼的幾種方式

    這篇文章主要介紹了MySQL修改密碼的幾種方式,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-12-12
  • MySQL主從狀態(tài)檢查的實現(xiàn)

    MySQL主從狀態(tài)檢查的實現(xiàn)

    這篇文章主要介紹了MySQL主從狀態(tài)檢查的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評論

和林格尔县| 巴中市| 东海县| 许昌县| 青龙| 石台县| 南城县| 南部县| 台湾省| 望谟县| 许昌县| 陈巴尔虎旗| 治县。| 贵港市| 毕节市| 宜春市| 化州市| 屯昌县| 新兴县| 怀化市| 临清市| 象山县| 石泉县| 阿坝县| 达拉特旗| 安图县| 无极县| 广东省| 太原市| 宣汉县| 襄汾县| 东平县| 岑巩县| 永清县| 三明市| 大竹县| 中卫市| 夏津县| 阳东县| 东乡族自治县| 封开县|