優(yōu)化MyBatis-Plus批量插入策略方式
一、用Mybatis-plus中的saveBatch方法
MyBatis-Plus 的 Service 層提供了 saveBatch 方法,可以方便地實現(xiàn)批量插入操作。但查閱源碼發(fā)現(xiàn),saveBatch的底層還是逐條插入的,這就會導(dǎo)致當數(shù)據(jù)量大的時候程序運行效率變慢
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
// 假設(shè)實體類為 User
class User {
private Long id;
private String name;
// 構(gòu)造函數(shù)、getter 和 setter 方法
public User() {}
public User(Long id, String name) {
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// 假設(shè) UserMapper 繼承自 BaseMapper
interface UserMapper extends com.baomidou.mybatisplus.core.mapper.BaseMapper<User> {}
// UserService 繼承自 ServiceImpl
@Service
class UserService extends ServiceImpl<UserMapper, User> {
public boolean saveUserBatch(List<User> userList) {
return this.saveBatch(userList);
}
}
// 調(diào)用示例
public class Main {
public static void main(String[] args) {
UserService userService = new UserService();
java.util.List<User> userList = new java.util.ArrayList<>();
userList.add(new User(1L, "Alice"));
userList.add(new User(2L, "Bob"));
boolean result = userService.saveUserBatch(userList);
if (result) {
System.out.println("批量插入成功");
} else {
System.out.println("批量插入失敗");
}
}
}
二、InsertBatchSomeColumn插件
它繼承了Abstractmethod類,在 MyBatis-Plus 中,InsertBatchSomeColumn 是一種用于批量插入部分列數(shù)據(jù)的插入策略,它可以幫助我們在批量插入數(shù)據(jù)時只插入部分需要的列,而不是插入所有列。
1.使用前配置
首先,確保你的項目中已經(jīng)添加了 MyBatis-Plus 和 MySQL 驅(qū)動的依賴。
如果你使用的是 Maven 項目,可以在 pom.xml 中添加以下依賴:
<dependencies>
<!-- MyBatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<!-- MySQL 驅(qū)動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
</dependencies>
2.代碼示例

1.配置類MybatisPlusConfig
- 創(chuàng)建一個自定義的
DefaultSqlInjector,并在getMethodList方法中添加InsertBatchSomeColumn方法,將其注入到 MyBatis-Plus 中。
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.List;
@Configuration
public class MybatisPlusConfig {
@Bean
public DefaultSqlInjector sqlInjector() {
return new DefaultSqlInjector() {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
List<AbstractMethod> methodList = super.getMethodList(mapperClass);
methodList.add(new InsertBatchSomeColumn());
return methodList;
}
};
}
}
2.實體類 User
使用 @TableName 注解指定該實體類對應(yīng)的數(shù)據(jù)庫表名。
為每個屬性提供了對應(yīng)的 getter 和 setter 方法,這里使用了 Lombok 的 @Data 注解來自動生成這些方法
ximport com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("user")
public class User {
private Long id;
private String name;
@TableField("age")
private Integer age;
private String email;
}
3.Mapper 接口 UserMapper
繼承自 BaseMapper,繼承了 MyBatis-Plus 提供的基本 CRUD 方法。
使用 @InsertProvider 注解指定插入方法的 SQL 提供者為 InsertBatchSomeColumn,并調(diào)用其 sql 方法生成 SQL 語句。
定義了 insertBatchSomeColumn 方法,用于批量插入部分列數(shù)據(jù)。
import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;
import com.baomidou.mybatisplus.extension.plugins.inner.SqlParserInner;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.builder.annotation.ProviderMethodResolver;
import java.util.List;
public interface UserMapper extends BaseMapper<User>, ProviderMethodResolver {
@InsertProvider(type = InsertBatchSomeColumn.class, method = "sql")
int insertBatchSomeColumn(@Param("list") List<User> list);
}
4.測試類 InsertBatchTest
實現(xiàn) CommandLineRunner 接口,在 run 方法中進行測試。
創(chuàng)建多個 User 對象并添加到列表中。
調(diào)用 UserMapper 的 insertBatchSomeColumn 方法進行批量插入,并打印插入的行數(shù)。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.ArrayList;
import java.util.List;
@SpringBootApplication
public class InsertBatchTest implements CommandLineRunner {
@Autowired
private UserMapper userMapper;
public static void main(String[] args) {
SpringApplication.run(InsertBatchTest.class, args);
}
@Override
public void run(String... args) throws Exception {
List<User> userList = new ArrayList<>();
User user1 = new User();
user1.setName("Alice");
user1.setAge(20);
userList.add(user1);
User user2 = new User();
user2.setName("Bob");
user2.setAge(22);
userList.add(user2);
int rows = userMapper.insertBatchSomeColumn(userList);
System.out.println("插入行數(shù): " + rows);
}
}
user2.setName("Bob");
user2.setAge(22);
userList.add(user2);
int rows = userMapper.insertBatchSomeColumn(userList);
System.out.println("插入行數(shù): " + rows);
}
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Mybatis-Plus開發(fā)提速器generator的使用
本文就介紹這款基于Mybatis-Plus的代碼自助生成器,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07
Spring Boot Controller處理HTTP請求體的方法
Spring Boot提供了強大的機制來處理不同 Content-Type? 的HTTP請求體,這主要依賴于 HttpMessageConverter? 接口的各種實現(xiàn),它們能夠自動將請求體內(nèi)容轉(zhuǎn)換成Java方法參數(shù),本文給大家介紹Spring Boot Controller處理HTTP請求體的方法,感興趣的朋友一起看看吧2025-05-05
詳解Java兩種方式簡單實現(xiàn):爬取網(wǎng)頁并且保存
本篇文章主要介紹了Java兩種方式簡單實現(xiàn):爬取網(wǎng)頁并且保存 ,主要用UrlConnection、HttpClient爬取實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下。2016-12-12
關(guān)于服務(wù)網(wǎng)關(guān)Spring Cloud Zuul(Finchley版本)
這篇文章主要介紹了關(guān)于服務(wù)網(wǎng)關(guān)Spring Cloud Zuul(Finchley版本),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03

