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,记录技术。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值