Mybatis-plus foreach拼接字符串查询无数据返回问题
作者:轻点 发布时间:2022-09-26 17:29:02
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而言,每一个考点背后都是有一个深刻的思想存在的,应该好好的体会。这样才能真正的做到技术提升,成为技术大牛。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
来源:https://blog.csdn.net/loney_wolf/article/details/108050212
猜你喜欢
- JSTL JSTL简介:JSTL的全称:JSP Standard Tag Library,JSP标准标签库JSTL的作用:&nbs
- properties配置文件如下:human.name=Mr.Yuhuman.age=21human.gender=male如何把prope
- 本文实例讲述了c#用for语句输出一个三角形的方法。分享给大家供大家参考。具体分析如下:这是一道面试题,要求是这样的:只使用一个for循环输
- Spring Cloud Gateway(以下简称 SCG)做为网关服务,是其他各服务对外中转站,通过 SCG 进行请求转发。在请求到达真正
- Java 2D API通过扩展抽象窗口工具箱(AWT),为Java程序提供了二维图像,文本和图形的功能。这个复杂的渲染包支持线形图像,文本和
- 1、什么是GradleGradle是一种结合了Ant和Maven两者优势的下一代构建工具,既有Ant构建灵活性的优点,也保留Maven约定优
- spring boot 作为微服务的便捷框架,在错误页面处理上也有一些新的处理,不同于之前的spring mvc 500的页面处理是比较简单
- 概念介绍不同的引用类型,主要体现的是对象不同的可达性(reachable)状态和对垃圾收集的影响。01. 强引用这个就
- ArrayList和LinkedList区别、扩容机制及底层实现ArrayListArrayList的底层实现为数组存储在内存中,线程不同步
- 定义:/** * @author Administrator * @project: TestOne * @package: PACKAGE
- 接着上篇java验证码制作(上篇)给大家介绍有关java验证码的相关知识!方法三:用开源组件Jcaptcha实现,与Spring组合使用可产
- 1、背景最近用到了Spring Cloud Alibaba开发微服务,在开发的过程中发现,当我们的服务上线或下线的时候,我们的Spring
- 简介ThreadPoolExecutor是一个实现ExecutorService接口的线程池,ExecutorService是主要用来处理多
- 前言在实际工作中,重试机制是一个很常见的场景,比如:发送消息失败,下载网络文件失败等…,因为这些错误可能是网络波动造成
- 在Java 8之前,对集合进行排序需要为排序中使用的比较器 Comparator 创建一个匿名内部类:new Compa
- 一、什么是SFTP?SFTP是一个安全文件传送协议,可以为传输文件提供一种安全的加密方法。SFTP 为 SSH的一部份,是一种传输文件到服务
- 这篇文章主要介绍了JDBC自定义连接池过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参
- 本文实例讲述了C#根据反射和特性实现ORM 映射的方法。分享给大家供大家参考。具体如下:(一)关于反射什么是反射?反射就是在运行时,动态获取
- 前言Vector是java.util包中的一个类。 SynchronizedList是java.util.Collections中的一个静态
- BASE64 编码是一种常用的字符编码,在很多地方都会用到。但base64不是安全领域下的加密解密算法。能起到安全作用的效果很差,而且很容易