mybatisplus怎么批量新增
时间: 2025-05-20 12:33:08 浏览: 15
### MyBatis Plus 批量新增的实现方式
MyBatis Plus 提供了便捷的方法来实现批量新增操作,主要依赖其内置工具类 `Batch` 和核心接口 `BaseMapper<T>` 的扩展能力。以下是详细的实现方式及相关代码示例。
---
#### 1. 使用 `saveBatch` 方法
MyBatis Plus 提供了一个简单易用的批量保存方法 `saveBatch`,适用于大多数场景下的批量插入需求[^1]。
```java
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class StudentService extends ServiceImpl<StudentMapper, Student> {
public boolean addStudents() {
List<Student> studentList = new ArrayList<>();
// 创建多个学生对象并添加到列表中
for (int i = 1; i <= 10; i++) {
Student student = new Student();
student.setName("Student_" + i);
student.setAge(i % 5 + 18); // 年龄范围为18至22岁
student.setEmail("student" + i + "@example.com");
studentList.add(student);
}
// 调用 saveBatch 方法进行批量插入
return this.saveBatch(studentList);
}
}
```
此方法会自动将传入的对象集合拆分为若干个小批次逐一提交事务,默认情况下每批次大小为 1000 条记录[^3]。
---
#### 2. 自定义 SQL 实现批量新增
如果默认的 `saveBatch` 方法无法满足特定需求(如需要自定义字段映射或特殊逻辑),可以通过手动编写 XML 或注解形式的 SQL 来实现更灵活的批量插入[^4]。
##### (1)通过注解实现
在 Mapper 接口中定义一个带有动态 SQL 的方法:
```java
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.jdbc.SQL;
import java.util.List;
public interface StudentMapper extends BaseMapper<Student> {
@InsertProvider(type = SqlProvider.class, method = "batchInsert")
int batchInsert(@Param("students") List<Student> students);
class SqlProvider {
public String batchInsert(@Param("students") List<Student> students) {
StringBuilder sqlBuilder = new StringBuilder("INSERT INTO student(name, age, email) VALUES ");
for (int i = 0; i < students.size(); i++) {
Student student = students.get(i);
sqlBuilder.append(String.format("('%s', %d, '%s')",
student.getName(), student.getAge(), student.getEmail()));
if (i != students.size() - 1) {
sqlBuilder.append(", ");
}
}
return sqlBuilder.toString();
}
}
}
```
调用时只需传递一个包含待插入数据的列表即可完成批量插入[^2]。
---
#### 3. 结合 PostgreSQL 特性实现 Upsert 操作
对于支持 UPSERT(即存在则更新,不存在则插入)特性的数据库(如 PostgreSQL),可通过 MyBatis Plus 配置相应的 SQL 语句来实现更加高效的批量操作。
```sql
<insert id="batchInsertOrUpdate">
INSERT INTO book(title, author, publish_date)
VALUES
<foreach collection="books" item="book" separator=",">
(#{book.title}, #{book.author}, #{book.publishDate})
</foreach>
ON CONFLICT (title) DO UPDATE SET
author = EXCLUDED.author,
publish_date = EXCLUDED.publish_date;
</insert>
```
对应的 Java 方法如下所示:
```java
Integer batchInsertOrUpdate(@Param("books") List<Book> books);
```
这种方法特别适合处理具有唯一约束的表结构,并能够有效减少重复数据带来的异常情况。
---
### 总结
以上介绍了三种不同的 MyBatis Plus 批量新增实现方式:直接使用框架提供的 `saveBatch` 方法、自定义 SQL 注解以及结合数据库特性完成 UPSERT 操作。具体选择哪种方案取决于实际应用场景和技术栈特点[^2][^3].
阅读全文
相关推荐


















