Mybatis-plus foreach拼接字符串查询无数据返回问题
foreach拼接字符串查询无数据返回
Mybatis-plus xml使用foreach遍历查询条件,填充IN函数时,查询不到数据
入参 List<String>[A,B,C,D,E,F]
WHERE sku_code IN <foreach collection="listHistoryBrowseDateVO.list" item="skuCode" index="index" open="(" close=")" separator=","> #{skuCode} </foreach>
以上代码在迭代器中,给IN函数赋值的时候,使用的是#{ }占位符号,最后解析出的sql是:
WHERE sku_code IN (A,B,C,D,E,F)不符合IN函数填充查询格式。
两种解决方式
1、将入参处理为: String ‘A’,‘B’,‘C’,‘D’,‘E’,‘F’,然后使用占位符 WHERE sku_code IN (#{}) 直接填充
2、入参处理为:List [ ‘A’,‘B’,‘C’,‘D’,‘E’,‘F’],使用迭代器+拼接符${}
入参 List<String> [ 'A','B','C','D','E','F']
WHERE sku_code IN <foreach collection="listHistoryBrowseDateVO.list" item="skuCode" index="index" open="(" close=")" separator=","> ${skuCode} </foreach>
Mybatis-plus #{} 占位符,${}拼接符,在sql解析的时是有区别的
精讲#{}和${}的区别是什么?
经常碰到这样的面试题目:#{}和${}的区别是什么?
网上的答案是:
#{}是预编译处理,${}是字符串替换。mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;mybatis在处理${}时,就是把${}替换成变量的值。使用#{}可以有效的防止SQL注入,提高系统安全性。
对于这个问题我感觉要抓住两点
(1)$符号一般用来当作占位符,常使用Linux脚本的人应该对此有更深的体会吧。既然是占位符,当然就是被用来替换的。知道了这点就能很容易区分$和#,从而不容易记错了。
(2)预编译的机制。预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译。我们知道,SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止SQL注入。
最后想说的是,对于mybatis以及sql而言,每一个考点背后都是有一个深刻的思想存在的,应该好好的体会。这样才能真正的做到技术提升,成为技术大牛。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
IntelliJ IDEA修改内存大小,使得idea运行更流畅
今天小编就为大家分享一篇关于IntelliJ IDEA修改内存大小,使得idea运行更流畅的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2018-10-10使用java web 在jsp文件及Class中连接MySQL和SQLserver 的驱动方法
这篇文章主要介绍了使用java web 在jsp文件及Class中连接MySQL和SQLserver的驱动方法的相关资料,本文介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下2016-10-10SpringBoot实现application.yml文件敏感信息加密
本文主要介绍了SpringBoot实现application.yml文件敏感信息加密,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-07-07
最新评论