欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis 批量新增工具類實現(xiàn)示例

 更新時間:2025年06月06日 10:46:51   作者:Jamie Chyi  
本文主要介紹了MyBatis批量操作工具類MyBatisBatchExecutorUtil,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在實際開發(fā)中,批量操作數(shù)據(jù)庫是提升效率的常見做法。MyBatis 提供了對批量操作的支持,但通常需要手動配置。本文將介紹如何使用 MyBatis 批量提交數(shù)據(jù)的工具類,實現(xiàn)更高效的數(shù)據(jù)庫操作。

1. 工具類概述 ??

MyBatisBatchExecutorUtil 是一個 MyBatis 批量操作工具類,通過 SqlSessionFactory 提供批量提交數(shù)據(jù)的功能。我們可以通過此類將數(shù)據(jù)按一定數(shù)量分組,避免一次性提交大量數(shù)據(jù)造成的內(nèi)存壓力。

2. 工具類代碼 ??

package com.lili.office.utils;

import java.util.List;

import javax.annotation.PostConstruct;

import com.google.common.collect.Lists;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author JamieChyi
 */
@Component
public class MyBatisBatchExecutorUtil {
    private static final Logger logger = LoggerFactory.getLogger(MyBatisBatchExecutorUtil.class);

    @Autowired
    private SqlSessionFactory sqlSessionFactory;
    private static MyBatisBatchExecutorUtil utils;

    @PostConstruct
    public void init() {
        utils = this;
        utils.sqlSessionFactory = this.sqlSessionFactory;
    }

    /**
     * 批量提交數(shù)據(jù)
     *
     * @param mapperClass     Mapper 類
     * @param mybatisSqlId    SQL 語句在 Mapper XML 文件中的 ID
     * @param dataList        要提交的數(shù)據(jù)列表
     */
    public static <T> void batchCommit(Class<?> mapperClass, String mybatisSqlId, List<T> dataList) {
        if (dataList == null || dataList.isEmpty()) {
            return;
        }

        SqlSession session = null;
        int commitCountEveryTime = 500;
        try {
            long startTime = System.currentTimeMillis();
            session = utils.sqlSessionFactory.openSession(ExecutorType.BATCH, false);
            List<List<T>> groupList = Lists.partition(dataList, commitCountEveryTime);
            for (List<T> tempList : groupList) {
                session.insert(mapperClass.getName() + "." + mybatisSqlId, tempList);
                session.commit();
                session.clearCache();
            }
            long endTime = System.currentTimeMillis();
            logger.info("批量插入數(shù)據(jù)耗時:" + (endTime - startTime) + "毫秒");
        } catch (Exception e) {
            logger.error("batchCommit error!", e);
            if (session != null) {
                session.rollback();
            }
        } finally {
            if (session != null) {
                session.close();
            }
        }
    }

    public static <T> void batchCommit(Class<?> mapperClass, List<T> dataList) {
        batchCommit(mapperClass, "insertPOBatch", dataList);
    }
}

解釋:

  • @Autowired 注解通過 Spring 注入 SqlSessionFactory 實例。

  • @PostConstruct 用于在類初始化后執(zhí)行初始化操作。

  • 批量提交邏輯通過將數(shù)據(jù)分批處理來避免一次性提交過多數(shù)據(jù)。

  • ExecutorType.BATCH:使用批處理模式,提升性能。

  • 分批提交:每次提交 500 條數(shù)據(jù),避免單次提交數(shù)據(jù)過多導(dǎo)致內(nèi)存占用過大。

3. 批量提交數(shù)據(jù) ??

方法一:指定 SQL ID 提交數(shù)據(jù)

public static <T> void batchCommit(Class<?> mapperClass, String mybatisSqlId, List<T> dataList) {
    // 處理邏輯
}

方法二:默認(rèn)使用 insertPOBatch 提交數(shù)據(jù)

public static <T> void batchCommit(Class<?> mapperClass, List<T> dataList) {
    batchCommit(mapperClass, "insertPOBatch", dataList);
}

解釋:

  • 第一種方法允許我們指定 Mapper 文件中的 SQL ID,可以靈活適應(yīng)不同場景。

  • 第二種方法為常用的批量插入,使用默認(rèn)的 SQL ID insertPOBatch。

4. 性能優(yōu)化 ??

批量提交數(shù)據(jù)能夠顯著提高性能,尤其是在處理大量數(shù)據(jù)時。通過將數(shù)據(jù)分批提交,可以避免一次性提交過多數(shù)據(jù)導(dǎo)致內(nèi)存溢出的問題。每次提交的數(shù)據(jù)量可以根據(jù)具體需求調(diào)整,通常使用 500 條作為合適的批次大小。

性能測試:

long startTime = System.currentTimeMillis();
// 執(zhí)行批量操作
long endTime = System.currentTimeMillis();
logger.info("批量插入數(shù)據(jù)耗時:" + (endTime - startTime) + "毫秒");

通過日志記錄,開發(fā)者可以及時了解批量提交的執(zhí)行時間,并進(jìn)行性能調(diào)優(yōu)。

5. 異常處理 ??

在批量提交過程中,我們應(yīng)該特別注意異常處理:

  • 如果出現(xiàn)異常,應(yīng)該執(zhí)行回滾操作,確保數(shù)據(jù)一致性。

  • 批量操作使用事務(wù)管理,可以在遇到問題時避免部分?jǐn)?shù)據(jù)提交成功而其他數(shù)據(jù)失敗的情況。

catch (Exception e) {
    logger.error("batchCommit error!", e);
    if (session != null) {
        session.rollback();
    }
}

總結(jié) ??

通過 MyBatisBatchExecutorUtil 工具類,我們可以輕松實現(xiàn) MyBatis 的批量提交操作,避免性能瓶頸和內(nèi)存壓力。合理的批量操作能夠顯著提升系統(tǒng)在處理大規(guī)模數(shù)據(jù)時的效率,是開發(fā)中必不可少的利器。

到此這篇關(guān)于MyBatis 批量新增工具類實現(xiàn)示例的文章就介紹到這了,更多相關(guān)MyBatis 批量新增工具類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何將文件流轉(zhuǎn)換成byte[]數(shù)組

    如何將文件流轉(zhuǎn)換成byte[]數(shù)組

    這篇文章主要介紹了如何將文件流轉(zhuǎn)換成byte[]數(shù)組,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • MyBatis基本實現(xiàn)過程

    MyBatis基本實現(xiàn)過程

    這篇文章主要介紹了Spring整合mybatis實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-07-07
  • IDEA的Project無法正常顯示的問題解決

    IDEA的Project無法正常顯示的問題解決

    本文主要介紹了IDEA的Project無法正常顯示的問題解決,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • IntelliJ?IDEA?2020.2.3永久破解激活教程(親測有效)

    IntelliJ?IDEA?2020.2.3永久破解激活教程(親測有效)

    intellij?idea?2022是一款市面上最好的JAVA?IDE編程工具,該工具支持git、svn、github等版本控制工具,整合了智能代碼助手、代碼自動提示等功能,本教程給大家分享IDEA?2022最新永久激活碼,感興趣的朋友參考下吧
    2020-10-10
  • 基于spring+hibernate+JQuery開發(fā)之電子相冊(附源碼下載)

    基于spring+hibernate+JQuery開發(fā)之電子相冊(附源碼下載)

    本篇文章介紹了,基于spring+hibernate+JQuery開發(fā)之電子相冊(附源碼下載)。需要的朋友參考下
    2013-05-05
  • Java中的do while循環(huán)控制語句基本使用

    Java中的do while循環(huán)控制語句基本使用

    這篇文章主要介紹了Java中的do while循環(huán)控制語句基本使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • jmeter中json提取器如何提取多個參數(shù)值

    jmeter中json提取器如何提取多個參數(shù)值

    關(guān)于jmeter中的正則表達(dá)式及json提取器可以提取響應(yīng)值,但是實際可以需要上個接口的多個響應(yīng)值,本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下
    2021-11-11
  • spring boot設(shè)置過濾器、監(jiān)聽器及攔截器的方法

    spring boot設(shè)置過濾器、監(jiān)聽器及攔截器的方法

    這篇文章主要給大家介紹了關(guān)于spring boot設(shè)置過濾器、監(jiān)聽器及攔截器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java面試題沖刺第一天--基礎(chǔ)篇1

    Java面試題沖刺第一天--基礎(chǔ)篇1

    這篇文章主要為大家分享了最有價值的三道java面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 基于Java Gradle復(fù)制項目模塊過程圖解

    基于Java Gradle復(fù)制項目模塊過程圖解

    這篇文章主要介紹了基于Java Gradle復(fù)制項目模塊過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06

最新評論