mybatis-plus根据指定条件批量更新

本文介绍了如何在Mybatis-Plus的UserServiceImpl中使用Function接口实现批量更新UserEntity,包括修改SqlMethod、自定义更新条件和默认batchSize设置。示例展示了如何通过Function调用updateBatchByQueryWrapper方法更新用户列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.service实现类中

比如我这里只针对UserEntity,在UserServiceImpl下(该实现类是继承了mybatis-plus的ServiceImpl的)新增如下代码:

public boolean updateBatchByQueryWrapper(Collection<UserEntity> entityList, Function<UserEntity, QueryWrapper> queryWrapperFunction) {
    String sqlStatement = this.getSqlStatement(SqlMethod.UPDATE);
    return this.executeBatch(entityList, DEFAULT_BATCH_SIZE, (sqlSession, entity) -> {
        ParamMap param = new ParamMap();
        param.put(Constants.ENTITY, entity);
        param.put(Constants.WRAPPER, queryWrapperFunction.apply(entity));
        sqlSession.update(sqlStatement, param);
    });
}

1)这里使用了Function函数式接口,如果不知道请查看Java函数式编程入门学习举例与优点详解
2)batchSize这里默认使用DEFAULT_BATCH_SIZE,也是mybatis-plus中的默认值1000,当然你也可以保留该入参
3)主要核心的修改地方是以下两部分:

// SqlMethod.UPDATE_BY_ID改为SqlMethod.UPDATE
String sqlStatement = this.getSqlStatement(SqlMethod.UPDATE);
//和新增如下的wapper,即更新条件
param.put(Constants.WRAPPER, queryWrapperFunction.apply(entity));

2.调用时

userService.updateBatchByQueryWrapper(userList, user->new QueryWrapper<>().eq("username",user.getUsername()));

3. 参考文章

### 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、付费专栏及课程。

余额充值