MyBatis 批量更新

MyBatis 实现批量更新语法如下

实现方式

Dao 层

  1. 提供一个指定名称的列表
1
void sortSurveyQuestions(@Param("questions") List<Long> questions);

Mapper 层

  1. 通过 <foreach/> 标签实现 MySQL 的 CASE-WHEN 语法
  2. 注意语法的前缀 CASE propertyName 放置在 <foreach/> 标签的 open 属性中,尾缀则放置在 close 属性中,同时 separator 属性中存在一个宫格
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<update id="sortSurveyQuestions">
    UPDATE
      pt_survey_question
    SET
      indexNo =
      <foreach collection="questions" index="index" item="question" separator=" " open="CASE id" close="END">
        WHEN #{question} THEN #{index}
      </foreach>
    WHERE
      id IN
    <foreach collection="questions" index="index" item="question" separator="," open="(" close=")">
      #{question}
    </foreach>
</update>

渲染结果

1
2
3
4
5
6
7
8
9
10
UPDATE
  pt_survey_question
SET
  indexNo = 
  CASE id
    WHEN 1 THEN 0
    WHEN 2 THEN 1
    WHEN 3 THEN 2
WHERE
  id IN (1, 2, 3)