Mybatis -- 批量更新操作

参考:https://my.oschina.net/ckanner/blog/338515

MySQL没有提供直接的方法来实现批量更新,但可以使用case when语法来实现这个功能。

UPDATE course
    SET name = CASE id 
        WHEN 1 THEN 'name1'
        WHEN 2 THEN 'name2'
        WHEN 3 THEN 'name3'
    END, 
    title = CASE id 
        WHEN 1 THEN 'New Title 1'
        WHEN 2 THEN 'New Title 2'
        WHEN 3 THEN 'New Title 3'
    END
WHERE id IN (1,2,3)

这条sql的意思是,如果id为1,则name的值为name1,title的值为New Title1;依此类推。

在Mybatis中的配置则如下:

<!-- 批量根据userId增加用户免费提现额度 -->
<update id="batchAddQuota" parameterType="java.util.List">
    <!-- 用法参考:https://my.oschina.net/ckanner/blog/338515 -->
    update t_user_balance
    <trim prefix="set" suffixOverrides=",">
        <trim prefix="quota =case" suffix="end,">
            <foreach collection="list" item="item" index="index">
                <if test="item.userId!=null">
                    when user_id=#{item.userId} then quota+#{item.quota}
                </if>
            </foreach>
        </trim>
    </trim>
    where
    <foreach collection="list" item="item" index="index" separator="or">
        user_id=#{item.userId}
    </foreach>  
</update>
### 如何在 Spring Boot 中使用 MyBatis-Plus 实现批量更新操作 #### 准备工作 为了实现批量更新,确保已经完成基本的环境准备和项目创建。这包括安装 JDK 8 或更高版本、Maven 3.5 或更高版本以及合适的 IDE 工具如 IntelliJ IDEA[^1]。 #### 添加依赖 在 `pom.xml` 文件中添加 MyBatis-Plus 和其他必要的依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本号</version> </dependency> ``` 同时,在项目的 application.yml 配置文件里设置好数据库连接和其他配置参数[^4]。 #### 创建实体类与 Mapper 接口 定义相应的实体类来映射数据库中的表格结构,并编写对应的 Mapper 接口继承 BaseMapper<T> 来获取默认 CRUD 方法支持。例如有一个名为 User 的表,则可以这样写: ```java // Entity Class @Data public class User { private Long id; private String name; private Integer age; } // Mapper Interface @Mapper public interface UserMapper extends BaseMapper<User> {} ``` #### 批量更新逻辑 对于简单的字段值修改,可以直接调用 updateBatchById() 方法来进行批量更新;而对于更复杂的场景则可能需要用到 Wrapper 对象构建查询条件后再执行更新动作。下面给出两个例子说明这两种情况下的做法: ##### 使用 updateBatchById() 当只需要更改某些特定记录的部分属性时(比如只改年龄),可以通过传递 List<Entity> 列表给此函数轻松达成目的: ```java List<User> userList = new ArrayList<>(); for (int i=0; i<ids.size(); ++i){ User user = new User(); user.setId(ids.get(i)); user.setAge(newAges.get(i)); // 假设新年龄存储在一个列表中 userList.add(user); } userMapper.updateBatchById(userList); ``` ##### 自定义 SQL 更新语句配合 Wrappers 如果要基于更多复杂业务规则做更新处理,那么应该考虑自定义 SQL 并利用 LambdaQueryWrapper<> 构建动态SQL表达式: ```java LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(User::getId, userId).set(User::getAge, updatedAge); int affectedRows = userMapper.update(null, wrapper); if(affectedRows > 0){ System.out.println("成功更新"); } else{ System.err.println("未找到匹配的数据或无任何改变发生!"); } ``` 注意这里传入的第一个参数为 null 表明不指定具体对象而是依靠后面的条件去定位待更新的目标集合[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值