mybatisplus mapper 批处理
时间: 2025-06-05 14:33:19 浏览: 12
### MyBatisPlus Mapper 批处理插入与更新的示例及配置
MyBatisPlus 是基于 MyBatis 的增强工具,提供了许多便捷的功能以简化开发流程。在批处理操作中,MyBatisPlus 提供了多种方式来实现高效的数据插入和更新操作。以下是详细的配置和代码示例[^2]。
#### 1. 配置文件设置
为了支持批处理操作,需要在 MyBatisPlus 的配置文件中设置合理的数据库连接池参数和批处理大小。以下是一个常见的 `application.yml` 配置示例:
```yaml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: root
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
global-config:
db-config:
id-type: auto
mapper-locations: classpath*:mapper/*.xml
# 数据库连接池配置
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
```
上述配置中,`maximum-pool-size` 和 `minimum-idle` 参数定义了连接池的最大和最小连接数,`connection-timeout` 等参数则用于优化数据库连接性能[^3]。
#### 2. Mapper 接口定义
MyBatisPlus 提供了内置的 `BaseMapper` 接口,可以直接使用其提供的批量插入和更新方法。如果需要自定义方法,则可以在继承 `BaseMapper` 的 Mapper 接口中定义。
```java
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
```
#### 3. 批量插入示例
MyBatisPlus 提供了 `insertBatch` 方法,可以一次性插入多条数据。以下是一个批量插入的代码示例:
```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 UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
public void batchInsert() {
List<User> userList = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
User user = new User();
user.setName("User" + i);
user.setAge(20 + i % 10);
userList.add(user);
}
// 每次插入 1000 条数据
this.saveBatch(userList, 1000);
}
}
```
在上述代码中,`saveBatch` 方法的第一个参数是待插入的数据列表,第二个参数是每批次插入的数量。通过这种方式,可以有效减少内存占用并提高插入效率[^1]。
#### 4. 批量更新示例
对于批量更新操作,MyBatisPlus 提供了 `updateBatchById` 方法。以下是一个批量更新的代码示例:
```java
public void batchUpdate() {
List<User> userList = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
User user = new User();
user.setId(i + 1L);
user.setName("UpdatedUser" + i);
user.setAge(30 + i % 10);
userList.add(user);
}
// 每次更新 1000 条数据
this.updateBatchById(userList, 1000);
}
```
在上述代码中,`updateBatchById` 方法同样支持分批次更新,避免一次性加载过多数据导致内存溢出问题[^1]。
#### 5. 异步任务优化
为了进一步提升性能,可以结合 Spring 的线程池机制实现异步任务处理。以下是一个基于 `ThreadPoolTaskExecutor` 的异步任务示例:
```java
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Component
public class AsyncTaskExecutor {
private final ThreadPoolTaskExecutor taskExecutor;
public AsyncTaskExecutor() {
taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(10);
taskExecutor.setMaxPoolSize(20);
taskExecutor.setQueueCapacity(100);
taskExecutor.setThreadNamePrefix("Async-");
}
@PostConstruct
public void initialize() {
taskExecutor.initialize();
}
@PreDestroy
public void destroy() {
taskExecutor.shutdown();
}
public void execute(Runnable task) {
taskExecutor.execute(task);
}
}
```
通过将批量插入或更新操作放入异步任务中执行,可以显著提高系统的并发能力和响应速度[^3]。
---
### 注意事项
1. 在批处理操作中,建议根据实际硬件资源调整批处理大小(如 1000 或 500),以平衡性能和内存占用。
2. 如果数据量非常大,可以考虑分页读取数据并进行分批次处理。
3. 配置合理的数据库连接池参数,确保数据库能够承受高并发的压力。
---
阅读全文
相关推荐


















