MyBatis 批量新增工具類實現(xiàn)示例
在實際開發(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)文章
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ā)之電子相冊(附源碼下載)。需要的朋友參考下2013-05-05Java中的do while循環(huán)控制語句基本使用
這篇文章主要介紹了Java中的do while循環(huán)控制語句基本使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01spring 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