優(yōu)化MyBatis-Plus批量插入策略方式
一、用Mybatis-plus中的saveBatch方法
MyBatis-Plus 的 Service 層提供了 saveBatch 方法,可以方便地實(shí)現(xiàn)批量插入操作。但查閱源碼發(fā)現(xiàn),saveBatch的底層還是逐條插入的,這就會導(dǎo)致當(dāng)數(shù)據(jù)量大的時(shí)候程序運(yùn)行效率變慢
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
// 假設(shè)實(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ù)時(shí)只插入部分需要的列,而不是插入所有列。
1.使用前配置
首先,確保你的項(xiàng)目中已經(jīng)添加了 MyBatis-Plus 和 MySQL 驅(qū)動(dòng)的依賴。
如果你使用的是 Maven 項(xiàng)目,可以在 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ū)動(dòng) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
</dependencies>
2.代碼示例

1.配置類MybatisPlusConfig
- 創(chuàng)建一個(gè)自定義的
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.實(shí)體類 User
使用 @TableName 注解指定該實(shí)體類對應(yīng)的數(shù)據(jù)庫表名。
為每個(gè)屬性提供了對應(yīng)的 getter 和 setter 方法,這里使用了 Lombok 的 @Data 注解來自動(dòng)生成這些方法
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
實(shí)現(xiàn) CommandLineRunner 接口,在 run 方法中進(jìn)行測試。
創(chuàng)建多個(gè) User 對象并添加到列表中。
調(diào)用 UserMapper 的 insertBatchSomeColumn 方法進(jìn)行批量插入,并打印插入的行數(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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java加載本地庫的方法之System.load與System.loadLibrary
最近在做的工作要用到本地方法,所以下面這篇文章主要介紹了Java加載本地庫的方法之System.load與System.loadLibrary的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09
JavaMail實(shí)現(xiàn)發(fā)送郵件(QQ郵箱)
這篇文章主要為大家詳細(xì)介紹了JavaMail實(shí)現(xiàn)發(fā)送郵件(QQ郵箱),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
如何使用intellij IDEA搭建Spring Boot項(xiàng)目
這篇文章主要介紹了如何使用intellij IDEA搭建Spring Boot項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Maven依賴管理之parent與dependencyManagement深入分析
首先我們來說說parent標(biāo)簽,其實(shí)這個(gè)不難解釋,就是父的意思,pom也有繼承的。比方說我現(xiàn)在有A,B,C,A是B,C的父級。現(xiàn)在就是有一個(gè)情況B,C其實(shí)有很多jar都是共同的,其實(shí)是可以放在父項(xiàng)目里面,這樣,讓B,C都繼承A就方便管理了2022-10-10
SpringBoot實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03

