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 student

SET score = 60

WHERE

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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐