业务场景
需要查询出某一个表中 主键 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)