MyBatis中的IN操作,根据ID列表批量更新

MyBatis中的IN操作

在写更新语句的时候,我们会遇到这样的业务

根据所选中的学生更新他的分数

举个栗子:

UPDATE student 
SET score = 60
WHERE sid IN (168,199);

上述SQL是在MySQL中的写法

那么我们在MyBatis中是如何通过传入ID列表完成对相应数据的更新操作呢?

下面我简单展示上个栗子的MyBatis执行过程的代码

StudentMapper.java (Mapper接口)

void updateSelectedStudentScore(@Param("sIds")List sIds);

StudentMapper.xml

<update id="updateSelectedStudentScore" parameterType="arraylist">
        UPDATE student 
        SET score = 60
        WHERE
        <foreach collection="sIds" index="index" item="id" separator=","
                 open="sid IN (" close=")">
            #{id}
        foreach>
update>

foreach元素的属性主要有 item,index,collection,open,separator,close。

  • item:表示集合中每一个元素进行迭代时的别名

  • index:指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,可不写

  • open:表示该语句以什么开始

  • separator:表示在每次进行迭代之间以什么符号作分隔符

  • close:表示以什么结束

详情请查看官方文档

MyBatis 3 文档

MyBatis Plus 文档

举个反例

这是我刚开始写的时候,并不太了解,所以会产生以下的错误。

以此篇文章记录我的沙雕时刻 哈哈哈哈哈哈

希望大家不要学我这个例子

StudentService.java

public void updateSelectedStudentScore(String sIds){
        List list = JSONObject.parseArray(sIds);
        StringBuilder idStr = new StringBuilder();
        for (int i = 0; i < list.size() - 1; i++) {
            idStr.append(list.get(i));
            idStr.append(",");
        }
        idStr.append(list.get(list.size() - 1));
		studentMapper.updateSelectedStudentScore(idStr.toString());
    }

接收前台传过来的ID列表,通过JSONObject.parseArray()转为List

StudentMapper.java

void updateSelectedStudentScore(@Param("sIds")String sIds);

StudentMapper.xml

<update id="updateSelectedAppMachineVersionAndIsUpdate" parameterType="String">
        UPDATE student 
        SET score = 60
        WHERE
    	sid IN (#{sIds})
update>

这个时候运行项目会出现

com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Truncated

### SQL: UPDATE student  SET score = 60, IS_UPDATE = 0  WHERE   SID IN (?)
### Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: '177,188,197'

网上查询,发现遇到这个错误的都不是我这个问题
有些是UPDATE 数据时 SET 多列之间使用“AND”造成的 例如这篇博文 出现Data truncation

或者是数据库编码问题 比如 这篇

后面想到传入的值是一个String,会出现‘传入的值’这样子的错误,导致SQL语句出错。
本文主要用于记录代码,记录Bug,记录技术。

你可能感兴趣的:(MyBatis,java,mybatis)