MybatisPlus实现批量插入更新数据库

MybatisPlus批量操作数据库实战
本文详细介绍了如何使用MybatisPlus在Spring Boot项目中进行批量插入和更新数据库的操作,适用于MySQL环境,通过实例代码展示了SQL优化提升效率的方法。

MybatisPlus实现批量插入更新数据库
 <insert id="batchSaveOrUpdate" parameterType="java.util.List">
        INSERT INTO
        user (<include refid="field" />)
        <foreach collection="userList" item="item" separator="," open=" VALUES "  close=" ">
            (
            #{
   
   item
### MyBatisPlus 实现批量更新插入的方法 #### 1. `saveBatch` 方法 MyBatisPlus 提供了内置的 `saveBatch` 方法用于批量保存数据。该方法会自动判断实体对象是否存在主键值,如果存在则尝试更新;如果不存在,则执行插入操作[^1]。 以下是使用 `saveBatch` 的代码示例: ```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 UserService extends ServiceImpl<UserMapper, User> { public void batchSaveOrUpdate(List<User> userList) { this.saveBatch(userList); // 调用 saveBatch 进行批量保存或更新 } } ``` 需要注意的是,默认情况下,`saveBatch` 不支持真正意义上的批量 SQL 执行(即单条 SQL 完成多条记录的操作)。为了提升性能,可以在 JDBC URL 中添加参数 `rewriteBatchedStatements=true`,从而让 MySQL 开启真正的批量处理模式。 --- #### 2. 自定义批量更新插入服务 除了直接使用 `saveBatch` 外,还可以通过自定义方式实现更灵活的批量更新插入功能。以下是一个基于回调机制的设计方案: ##### (1) 创建通用批量插入/更新服务类 ```java import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @FunctionalInterface public interface BatchInsertCallback<T> { List<T> process(List<T> entities); } public abstract class AbstractBatchService<T> implements IService<T> { public void batchSaveOrUpdate(List<T> entityList, BatchInsertCallback<T> callback) { if (entityList == null || entityList.isEmpty()) { return; } List<T> processedEntities = callback.process(entityList); // 判断是否有主键值来决定是更新还是插入 for (T entity : processedEntities) { UpdateWrapper<T> updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", ((User) entity).getId()); boolean exists = this.count(updateWrapper) > 0; if (exists) { this.updateById(entity); // 更新 } else { this.save(entity); // 插入 } } } } ``` ##### (2) 使用自定义批量服务 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.List; @Service public class CustomUserService extends AbstractBatchService<User> { @Autowired private UserService userService; public void customBatchSaveOrUpdate(List<User> users) { super.batchSaveOrUpdate(users, user -> { // 可在此处对用户列表进行预处理 return Arrays.asList(new User(1L, "UpdatedName"), new User(null, "NewInsertedName")); }); } } ``` 上述代码展示了如何通过回调函数动态调整待插入更新的数据集合[^2]。 --- #### 3. 配置优化建议 为了进一步提高批量操作的效率,可以考虑以下几个方面: - **JDBC 参数配置**:在数据库连接字符串中加入 `rewriteBatchedStatements=true`,使 MySQL 支持真正的批量语句执行。 - **事务管理**:确保批量操作在一个事务中完成,减少多次提交带来的开销。 - **分批处理**:对于超大数据集,可采用分批次的方式逐步写入,避免内存溢出等问题。 --- ### 总结 无论是使用 MyBatisPlus 内置的 `saveBatch` 方法,还是通过自定义批量服务实现更加复杂的业务需求,都可以有效满足实际开发中的场景要求。同时,合理利用数据库驱动特性以及事务控制手段能够显著改善程序运行效率。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值