记一次在mybatis中使用String字符串作为sql语句 in关键字 后面参数的事故

简介: 记一次在mybatis中使用String字符串作为sql语句 in关键字 后面参数的事故

业务场景

需要查询出某一个表中 主键 id 在 13,14,15,16的之间的数据,前台传过来的是一个String类型的字符串 “13,14,15,16”。我上去就没多想直接将这个参数传到sql语句中了,

xml中的sql与语句写法如下:


SELECT * from user where  id in ( #{ids} )


结果可想而知一条数据也没有查出来。


解决方案:

使用mybatis的 <foreach> 标签, 并将ids由字符串转换为一个List<String> 类型的数组.

SELECT * from user where  id in
<foreach item="userId" collection="userIds"  open="(" separator="," close=")">
            #{userId}
        </foreach>


String[] split = userIds.split(",");
        List<String> strings = Arrays.asList(split);


分析原因:

一开始的那种做法相当于把整个userIds当成一个参数,或者说成把 “13,14,15,16” 当成一个id 所以就一个也查询不到了。

这种猜想也在控制台的sql语句中得到印证:


方案一的控制台的sql打印和传参(第一次错误的方式):
DEBUG o.a.e.i.p.e.J.selectJobsToExecute - ==>  Preparing: SELECT * from user where  id in(?)
 DEBUG o.a.e.i.p.e.J.selectJobsToExecute - ==> Parameters: 13,14,15,16(String)


方案二的控制台的sql打印和传参(解决方案):

DEBUG o.a.e.i.p.e.J.selectJobsToExecute - ==>  Preparing: SELECT * from user where  id in(?,?,?,?)
DEBUG o.a.e.i.p.e.J.selectJobsToExecute - ==> Parameters: 13(String),14(String),15(String),16(String)


目录
相关文章
|
Python
Python中的f-string:更优雅的字符串格式化
Python中的f-string:更优雅的字符串格式化
666 100
|
开发者 Python
Python中的f-string:高效字符串格式化的利器
Python中的f-string:高效字符串格式化的利器
756 99
Python中的f-string:更优雅的字符串格式化
Python中的f-string:更优雅的字符串格式化
|
开发者 Python
Python f-string:高效字符串格式化的艺术
Python f-string:高效字符串格式化的艺术
|
Python
Python中的f-string:更简洁的字符串格式化
Python中的f-string:更简洁的字符串格式化
657 92
|
SQL Java 数据库连接
MyBatis动态SQL字符串空值判断,这个细节99%的程序员都踩过坑!
本文深入探讨了MyBatis动态SQL中字符串参数判空的常见问题。通过具体案例分析,对比了`name != null and name != &#39;&#39;`与`name != null and name != &#39; &#39;`两种写法的差异,指出后者可能引发逻辑混乱。为避免此类问题,建议在后端对参数进行预处理(如trim去空格),简化MyBatis判断逻辑,提升代码健壮性与可维护性。细节决定成败,严谨处理参数判空是写出高质量代码的关键。
2165 0
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
637 14
|
数据处理
鸿蒙开发:ArkTs字符串string
字符串类型是开发中非常重要的一个数据类型,除了上述的方法概述之外,还有String对象,正则等其他的用处,我们放到以后得篇章中讲述。
1238 19