添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
乐观的签字笔  ·  Could not resolve ...·  3 月前    · 
会搭讪的茄子  ·  ATEM Constellation | ...·  5 月前    · 
坚强的西装  ·  不知君ASMR导航·  5 月前    · 
有胆有识的蛋挞  ·  Upgrade 5.4.18.FINAL ...·  5 月前    · 

Mybatis 批量更新数据 Mysql批量更新数据

通常如果需要一次更新多条数据有两个方式,(1)在业务代码中循环遍历逐条更新。(2)一次性更新所有数据

1 批量更新相同的值 不同的条件

如这里根据订单ID来更新订单表中的两个值

1.1 java中对应的接口

//DtsOrder 是我定义的一个普通的实体类
 void updateException(@Param("sendFaileList") List<DtsOrder> sendFaileList,@Param("now") LocalDateTime now);
<!--批量更新-->
<update id="updateException" parameterType="List">
    UPDATE dts_order 
    SET is_exception =2,scan_time=#{now}
    WHERE id in
    <foreach collection="sendFaileList" item="item" index="index"
             open="(" close=")" separator=",">
        #{item.id}
    </foreach>
</update>

2 批量更新不同的值 不同的条件

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

UPDATE brand
    SET name = CASE id 
        WHEN 1 THEN 'name1'
        WHEN 2 THEN 'name2'
        WHEN 3 THEN 'name3'
    address = CASE id 
        WHEN 1 THEN '地址1'
        WHEN 2 THEN '地址2'
        WHEN 3 THEN '地址3'
WHERE id IN (1,2,3)

这条sql的意思是,如果id为1,则name的值为name1,address 的值为地址1;依此类推。

<update id="updatebrandList" parameterType="list">
    update brand
    <trim prefix="set" suffixOverrides=",">
        <trim prefix="name=case" suffix="end,">
            <foreach collection="list" item="item" index="index">
                <if test="item.name!=null">
                    when id=#{item.id} then #{item.name}
            </foreach>
        </trim>
        <trim prefix="address =case" suffix="end,">
            <foreach collection="list" item="item" index="index">
                <if test="item.title!=null">
                    when id=#{item.id} then #{item.address}
            </foreach>
        </trim>
    </trim>
    where
    <foreach collection="list" separator="or" item="item" index="index">
        id=#{item.id}
    </foreach>
</update>

对应的java接口

/**
 * 批量更新销量 DtsBrand 是普通的实体类
 * @param brandList
void updatebrandList(@Param("list") List<DtsBrand> brandList);

3 foreach成多条sql

这种方式最简单,就是用foreach组装成多条update语句,但Mybatis映射文件中的sql语句默认是不支持以" ; " 结尾的,也就是不支持多条sql语句的执行。所以需要在连接mysql的url上加 &allowMultiQueries=true 这个才可以执行。

<update id="updatebrandList"  parameterType="java.util.List">  
    <foreach collection="list" item="item" index="index" open="" close="" separator=";">
        update tableName