Mybatis之批量更新操作

本文介绍了使用MyBatis进行批量更新操作的方法,包括更新单条记录、多条记录的同一字段以及多条记录的不同字段,并展示了如何利用CASE WHEN语法和MyBatis的foreach等标签实现高效批量更新。

Mybatis之批量更新操作

 

更新单条记录

1

UPDATE course SET name 'course1' WHERE id = 'id1';

 

更新多条记录的同一个字段为同一个值

1

UPDATE course SET name 'course1' WHERE id in ('id1''id2', 'id3);

 

更新多条记录为多个字段为不同的值

比较普通的写法,是通过循环,依次执行update语句。

Mybatis写法如下:

1

2

3

4

5

6

7

8

9

<update id="updateBatch"  parameterType="java.util.List">  

    <foreach collection="list" item="item" index="index" open="" close="" separator=";">

        update course

        <set>

            name=${item.name}

        </set>

        where id = ${item.id}

    </foreach>      

</update>

 

一条记录update一次,性能比较差,容易造成阻塞。

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

1

2

3

4

5

6

7

8

9

10

11

12

UPDATE course

    SET name CASE id 

        WHEN THEN 'name1'

        WHEN THEN 'name2'

        WHEN THEN 'name3'

    END

    title = CASE id 

        WHEN THEN 'New Title 1'

        WHEN THEN 'New Title 2'

        WHEN THEN 'New Title 3'

    END

WHERE id IN (1,2,3)

 

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

在Mybatis中的配置则如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

<update id="updateBatch" parameterType="list">

            update course

            <trim prefix="set" suffixOverrides=",">

             <trim prefix="peopleId =case" suffix="end,">

                 <foreach collection="list" item="i" index="index">

                         <if test="i.peopleId!=null">

                          when id=#{i.id} then #{i.peopleId}

                         </if>

                 </foreach>

              </trim>

              <trim prefix=" roadgridid =case" suffix="end,">

                 <foreach collection="list" item="i" index="index">

                         <if test="i.roadgridid!=null">

                          when id=#{i.id} then #{i.roadgridid}

                         </if>

                 </foreach>

              </trim>

              

              <trim prefix="type =case" suffix="end," >

                 <foreach collection="list" item="i" index="index">

                         <if test="i.type!=null">

                          when id=#{i.id} then #{i.type}

                         </if>

                 </foreach>

              </trim>

       <trim prefix="unitsid =case" suffix="end," >

                  <foreach collection="list" item="i" index="index">

                          <if test="i.unitsid!=null">

                           when id=#{i.id} then #{i.unitsid}

                          </if>

                  </foreach>

           </trim>

             </trim>

            where

            <foreach collection="list" separator="or" item="i" index="index" >

              id=#{i.id}

          </foreach>

</update>

转载于:https://my.oschina.net/u/2458549/blog/1021765

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值