MyBatis 批量新增工具類實(shí)現(xiàn)示例
在實(shí)際開發(fā)中,批量操作數(shù)據(jù)庫是提升效率的常見做法。MyBatis 提供了對批量操作的支持,但通常需要手動(dòng)配置。本文將介紹如何使用 MyBatis 批量提交數(shù)據(jù)的工具類,實(shí)現(xiàn)更高效的數(shù)據(jù)庫操作。
1. 工具類概述 ??
MyBatisBatchExecutorUtil 是一個(gè) 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ù)耗時(shí):" + (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實(shí)例。@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í)。通過將數(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ù)耗時(shí):" + (endTime - startTime) + "毫秒");
通過日志記錄,開發(fā)者可以及時(shí)了解批量提交的執(zhí)行時(shí)間,并進(jìn)行性能調(diào)優(yōu)。
5. 異常處理 ??
在批量提交過程中,我們應(yīng)該特別注意異常處理:
如果出現(xiàn)異常,應(yīng)該執(zhí)行回滾操作,確保數(shù)據(jù)一致性。
批量操作使用事務(wù)管理,可以在遇到問題時(shí)避免部分?jǐn)?shù)據(jù)提交成功而其他數(shù)據(jù)失敗的情況。
catch (Exception e) {
logger.error("batchCommit error!", e);
if (session != null) {
session.rollback();
}
}
總結(jié) ??
通過 MyBatisBatchExecutorUtil 工具類,我們可以輕松實(shí)現(xiàn) MyBatis 的批量提交操作,避免性能瓶頸和內(nèi)存壓力。合理的批量操作能夠顯著提升系統(tǒng)在處理大規(guī)模數(shù)據(jù)時(shí)的效率,是開發(fā)中必不可少的利器。
到此這篇關(guān)于MyBatis 批量新增工具類實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)MyBatis 批量新增工具類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IntelliJ?IDEA?2020.2.3永久破解激活教程(親測有效)
intellij?idea?2022是一款市面上最好的JAVA?IDE編程工具,該工具支持git、svn、github等版本控制工具,整合了智能代碼助手、代碼自動(dòng)提示等功能,本教程給大家分享IDEA?2022最新永久激活碼,感興趣的朋友參考下吧2020-10-10
基于spring+hibernate+JQuery開發(fā)之電子相冊(附源碼下載)
本篇文章介紹了,基于spring+hibernate+JQuery開發(fā)之電子相冊(附源碼下載)。需要的朋友參考下2013-05-05
Java中的do while循環(huán)控制語句基本使用
這篇文章主要介紹了Java中的do while循環(huán)控制語句基本使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
jmeter中json提取器如何提取多個(gè)參數(shù)值
關(guān)于jmeter中的正則表達(dá)式及json提取器可以提取響應(yīng)值,但是實(shí)際可以需要上個(gè)接口的多個(gè)響應(yīng)值,本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下2021-11-11
spring boot設(shè)置過濾器、監(jiān)聽器及攔截器的方法
這篇文章主要給大家介紹了關(guān)于spring boot設(shè)置過濾器、監(jiān)聽器及攔截器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
基于Java Gradle復(fù)制項(xiàng)目模塊過程圖解
這篇文章主要介紹了基于Java Gradle復(fù)制項(xiàng)目模塊過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06

