记一次在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)


目录
相关文章
|
29天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
21天前
|
索引 Python
String(字符串)
String(字符串)。
26 3
|
2月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
61 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
2月前
|
NoSQL Redis
Redis 字符串(String)
10月更文挑战第16天
45 4
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
43 10
|
3月前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
577 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
3月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
3月前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
2月前
|
canal 安全 索引
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
38 5
|
2月前
|
存储 JavaScript 前端开发
JavaScript 字符串(String) 对象
JavaScript 字符串(String) 对象
45 3