MyBatisPlus中批量插入之如何通過開啟rewriteBatchedStatements=true
MyBatis Plus通過開啟rewriteBatchedStatements=true
通過開啟rewriteBatchedStatements=true的優(yōu)點
在MyBatis Plus框架中,批量插入是一種高效的數(shù)據(jù)庫操作方式。
通過開啟rewriteBatchedStatements=true
,可以獲得許多優(yōu)點,從而提高數(shù)據(jù)庫插入性能、減輕負載以及簡化代碼。
1. 提高性能
傳統(tǒng)的一條記錄一次插入方式會導致頻繁的與數(shù)據(jù)庫服務器的交互,增加了網(wǎng)絡開銷和處理延遲。
相比之下,通過批量插入將多個數(shù)據(jù)記錄組合成一個批處理語句進行插入,減少了與數(shù)據(jù)庫服務器的交互次數(shù),顯著提高了性能。
2. 減輕負載
每條SQL語句在數(shù)據(jù)庫服務器上都需要進行解析、驗證和執(zhí)行等操作,這些操作會占用系統(tǒng)資源并且耗費時間。
通過批量插入,將多條INSERT語句合并為一條語句執(zhí)行,減少了對數(shù)據(jù)庫的負載,提高了整體的系統(tǒng)響應速度。
3. 事務支持
MyBatis Plus中的批量插入默認會開啟事務管理。
在批量插入過程中,如果遇到插入錯誤,整個批量插入操作會回滾,確保數(shù)據(jù)的一致性,使用務支持是非常重要的,它可以有效地防止數(shù)據(jù)插入過程中出現(xiàn)意外情況導致數(shù)據(jù)不一致或丟失。
4. 簡化代碼
使用傳統(tǒng)的逐條插入方式,需要手動編寫循環(huán)語句來遍歷數(shù)據(jù)集合,并逐個執(zhí)行插入操作。而通過批量插入,可以直接將整個數(shù)據(jù)集合傳遞給數(shù)據(jù)庫驅動程序進行處理,減少了編碼復雜度和工作量。這樣簡化的代碼邏輯使得開發(fā)更加高效。
綜上所述,通過開啟rewriteBatchedStatements=true
使用MyBatis Plus中的批量插入功能帶來了諸多優(yōu)點。它不僅提高了數(shù)據(jù)庫操作性能、減輕了負載,也支持事務管理,并且簡化了代碼邏輯。這種功能在處理大量數(shù)據(jù)插入的場景中非常有價值和實用。
實現(xiàn)方法
在使用MyBatis Plus的項目中,我們需要在配置文件中進行相應的配置來開啟rewriteBatchedStatements=true
。
下面是一個示例的配置示例:
# application.properties 或者 application.yml(根據(jù)你的配置文件類型) spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?rewriteBatchedStatements=true spring.datasource.username=your_username spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
在上述配置中,spring.datasource.url
選項設置了數(shù)據(jù)庫連接的URL,并通過rewriteBatchedStatements=true
開啟了MySQL驅動程序的批量處理功能。
這個示例假定你正在使用Spring Boot并將相關的配置信息存儲在application.properties
或者application.yml
文件中。根據(jù)你的具體項目和方式,你可能需要在不同的配置文件中添加這個配置,或者使用其他方式來設置。
請確保將spring.datasource.url
中的mydatabase
替換為你實際的數(shù)據(jù)庫名,并在spring.datasource.username
和spring.datasource.password
中提供正確的數(shù)據(jù)庫用戶名和密碼。
通過在配置文件中設置rewriteBatchedStatements=true
,就可以在MyBatis Plus中啟用批量插入的功能,并獲得其帶來的優(yōu)點。這樣,在執(zhí)行批量插入操作時,MyBatis Plus會自動將多條INSERT語句合并為一條語句執(zhí)行,提高數(shù)據(jù)庫插入的性能和效率。
請注意,具體的配置方式可能因項目環(huán)境而異,請根據(jù)你的實際情況進行相應的配置。
代碼演示
當使用MyBatis Plus實現(xiàn)批量插入時,需要在Mapper層定義批量插入的方法,在Service層調(diào)用該方法,并在ServiceImpl層進行具體的業(yè)務邏輯處理。
下面是一個完整的示例代碼:
Mapper層
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; import java.util.List; public interface UserMapper extends BaseMapper<User> { void batchInsert(@Param("list") List<User> userList); }
在上述代碼中,我們定義了一個UserMapper接口,繼承自BaseMapper。
在該接口中,添加了一個batchInsert
方法,參數(shù)為List<User>
類型的userList。
Service層
import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; public interface UserService extends IService<User> { void batchInsertUsers(List<User> userList); }
在上述代碼中,我們定義了一個UserService接口,繼承自IService。
在該接口中,添加了batchInsertUsers
方法,參數(shù)為List<User>
類型的userList。
ServiceImpl層
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service @Transactional(rollbackFor = Exception.class) public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override public void batchInsertUsers(List<User> userList) { baseMapper.batchInsert(userList); } }
在上述代碼中,我們創(chuàng)建了一個UserServiceImpl類,該類繼承了ServiceImpl,同時實現(xiàn)了UserService接口。在batchInsertUsers
方法中,我們調(diào)用了baseMapper的batchInsert
方法來執(zhí)行批量插入操作。
在此示例中,使用了@Transactional
注解來開啟事務,并通過rollbackFor = Exception.class
設置了異?;貪L策略,確保批量插入操作具有事務支持。請注意,在ServiceImpl層中,我們注入了UserMapper接口,可以通過baseMapper來訪問對應的數(shù)據(jù)庫操作。
測試方法
當需要測試插入大量數(shù)據(jù)的性能時,你可以添加一個測試方法來插入十萬條數(shù)據(jù)并計算執(zhí)行時間。
下面是一個示例的測試方法:
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.ArrayList; import java.util.List; @SpringBootTest public class UserBatchInsertTest { @Autowired private UserService userService; @Test public void testBatchInsertPerformance() { // 創(chuàng)建一萬條用戶數(shù)據(jù) List<User> userList = new ArrayList<>(); for (int i = 0; i < 100000; i++) { User user = new User(); // 設置用戶屬性 user.setName("User" + i); // 添加到用戶列表 userList.add(user); } long startTime = System.currentTimeMillis(); // 執(zhí)行批量插入操作 userService.batchInsertUsers(userList); long endTime = System.currentTimeMillis(); long executionTime = endTime - startTime; System.out.println("插入十萬條數(shù)據(jù)耗時:" + executionTime + "ms"); } }
在上述代碼中,我們創(chuàng)建了一個UserBatchInsertTest
測試類,并注入UserService
接口用于進行批量插入操作。
在testBatchInsertPerformance
測試方法中,我們首先創(chuàng)建了一萬條用戶數(shù)據(jù),在循環(huán)中設置了用戶屬性,并將其添加到用戶列表中。然后記錄開始時間。
接著調(diào)用userService.batchInsertUsers
方法,執(zhí)行批量插入操作。
最后,記錄結束時間,計算執(zhí)行時間,并將結果打印出來。
通過運行此測試方法,你可以測試插入十萬條數(shù)據(jù)的性能,并獲得插入操作所花費的時間。這樣可以測試批量插入功能的效率和性能。
請注意,在運行大量數(shù)據(jù)插入測試時,可能會對數(shù)據(jù)庫和系統(tǒng)帶來一定的負載,請根據(jù)具體情況進行調(diào)整和優(yōu)化。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
詳解Java中布隆過濾器(Bloom Filter)原理及其使用場景
布隆過濾器是1970年由布隆提出的,它實際上是一個很長的二進制向量和一系列隨機映射函數(shù),它的作用是檢索一個元素是否存在我們的集合之中,本文給大家詳細的講解一下布隆過濾器,感興趣的同學可以參考閱讀2023-05-05SpringBoot+Shiro學習之密碼加密和登錄失敗次數(shù)限制示例
本篇文章主要介紹了SpringBoot+Shiro學習之密碼加密和登錄失敗次數(shù)限制示例,可以限制登陸次數(shù),有興趣的同學可以了解一下。2017-03-03SpringCloud2020 bootstrap 配置文件失效的解決方法
這篇文章主要介紹了SpringCloud2020 bootstrap 配置文件失效的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02Java集合框架迭代器Iterator實現(xiàn)原理解析
這篇文章主要介紹了Java集合框架迭代器Iterator實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08Spring Boot 整合 Druid 并開啟監(jiān)控的操作方法
本文介紹了如何在SpringBoot項目中引入和配置Druid數(shù)據(jù)庫連接池,并開啟其監(jiān)控功能,通過添加依賴、配置數(shù)據(jù)源、開啟監(jiān)控、自定義配置以及訪問監(jiān)控頁面,開發(fā)者可以有效提高數(shù)據(jù)庫訪問效率并監(jiān)控連接池狀態(tài),感興趣的朋友跟隨小編一起看看吧2025-01-01