Mybatis 进行批量更新

Mybatis 进行批量更新

公司使用的ORM是mybatis-plus默认内置的批量更新其实是通过foreach去实现的。故需要手动编写xml进行批量更新。

SQL原理

批量更新所使用的SQL关键就是WHEN CASE THEN ELSE。提供一份试例SQL

  

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
UPDATE a
SET name = CASE id
  WHEN 1 THEN "张三"
  WHEN 2 THEN "李四"
  WHEN 3 THEN "老王"
 END,
SET age = CASE id
  WHEN 1 THEN 18
  WHEN 2 THEN 19
  WHEN 3 THEN 20
 END,
WHERE id in (1,2,3);

Mybatis xml中的实现

 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
<update id="updateBatch">
    UPDATE a
      SET
        name = CASE id
            <foreach collection ="inputList" item="item">
                WHEN #{item.id} THEN
                <choose>
                    <when test="item.name != null">
                        #{item.name}
                    </when>
                    <otherwise>
                        name
                    </otherwise>
                </choose>
            </foreach>
        END
        , age = CASE id
            <foreach collection ="inputList" item="item">
                WHEN #{item.age} THEN
                <choose>
                    <when test="item.age != null">
                        #{item.age}
                    </when>
                    <otherwise>
                        age
                    </otherwise>
                </choose>
            </foreach>
        END
    WHERE id in
    <foreach collection ="inputList" item="item" open="(" separator="," close=")">
        #{item.id}
    </foreach>
</update>

在上面的demo中使用了`when`以及`otherwise`目的是为什么支持对没有传的字段不进行更新。这里实际使用 的时候应该通过反射等手段判断哪些列是不需要进行更新,从而压缩SQL的长度。得空的时候我会对这个进行一个性能测试。