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