具体代码实现mybatisplus实现批量新增
时间: 2023-09-28 13:10:18 浏览: 110
使用Mybatis-Plus实现批量新增可以使用其提供的`insertBatch`方法。
示例代码:
```java
List<User> userList = new ArrayList<>();
// 假设需要新增10个用户
for (int i = 1; i <= 10; i++) {
User user = new User();
user.setName("user" + i);
user.setAge(i);
userList.add(user);
}
// 调用insertBatch方法进行批量新增
boolean result = userService.saveBatch(userList);
if (result) {
System.out.println("批量新增成功");
} else {
System.out.println("批量新增失败");
}
```
其中,`User`为实体类,`userService`为对应的Service类。需要注意的是,实体类中需要使用注解`@TableName`指定对应的数据库表名,并且实体类中的属性需要与数据库表中的字段名一一对应。
如果需要批量新增的数据量较大,可以考虑使用分批次插入的方式,以避免一次性插入过多数据导致性能问题。
相关问题
mybatisplus批量新增
使用 MyBatis-Plus 进行批量新增可以通过 `insertBatch` 方法实现,示例代码如下:
```java
List<User> userList = new ArrayList<>();
userList.add(new User("user1", 18));
userList.add(new User("user2", 20));
userList.add(new User("user3", 22));
userMapper.insertBatch(userList);
```
其中 `User` 是需要新增的实体类,`userMapper` 是自动生成的 Mapper 接口。
需要注意的是,`insertBatch` 方法默认是使用 MySQL 的 `insert into ... values (), (), ...` 语法实现的,如果需要使用其他数据库的批量新增语法,可以在 `application.yml` 中进行配置,例如:
```yaml
mybatis-plus:
configuration:
# Oracle 批量保存最大数量,超过此数量则使用普通的 insert 语句
executor-type: batch
# MySQL 批量保存使用的语法
map-underscore-to-camel-case: true
jdbc-type-for-null: 'null'
# PostgreSQL 批量保存使用的语法
batch: 'org.apache.ibatis.executor.BatchExecutor'
```
具体使用哪种批量新增语法需要根据数据库类型和实际情况进行选择。
mybatisplus怎么批量新增
### 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].
阅读全文
相关推荐














