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 &lsquo;A&rsquo;,&lsquo;B&rsquo;,&lsquo;C&rsquo;,&lsquo;D&rsquo;,&lsquo;E&rsquo;,&lsquo;F&rsquo;,然后使用占位符 WHERE sku_code IN (#{}) 直接填充

2、入参处理为:List [ &lsquo;A&rsquo;,&lsquo;B&rsquo;,&lsquo;C&rsquo;,&lsquo;D&rsquo;,&lsquo;E&rsquo;,&lsquo;F&rsquo;],使用迭代器+拼接符${}

入参 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

标签:foreach,拼接字符串,查询,数据返回
0
投稿

猜你喜欢

  • C# form-data上传图片流到远程服务器的详细代码

    2022-06-12 01:39:58
  • spring boot 集成 shiro 自定义密码验证 自定义freemarker标签根据权限渲染不同页面(推荐

    2023-07-28 17:39:16
  • 聊聊Unity 自定义日志保存的问题

    2021-11-28 15:38:55
  • Spring Security添加验证码的两种方式小结

    2021-08-05 17:24:25
  • 如何用C#实现SAGA分布式事务

    2022-11-29 20:34:49
  • 图解Java线程的生命周期

    2022-04-12 15:16:10
  • C#实现把科学计数法(E)转化为正常数字值

    2022-09-06 23:41:47
  • Java下SpringBoot创建定时任务详解

    2023-10-03 01:25:23
  • Spring Boot 优雅整合多数据源

    2023-08-22 16:05:07
  • 在IDEA中配置tomcat并创建tomcat项目的图文教程

    2023-08-11 11:33:59
  • C#中XML基础用法

    2023-08-05 17:12:34
  • Java实现json数据处理的常用脚本分享

    2022-07-27 15:21:39
  • javaWeb使用servlet搭建服务器入门

    2023-11-21 04:47:45
  • 比较有效的使用C#读取文件的代码

    2022-11-07 08:43:34
  • Java 方法签名详解及实例代码

    2022-02-04 05:56:06
  • resty upload无需依赖的文件上传与下载

    2023-01-17 14:54:31
  • C++实现LeetCode(159.最多有两个不同字符的最长子串)

    2023-06-20 22:39:46
  • SpringBoot整合screw实现数据库文档自动生成的示例代码

    2023-11-29 05:30:15
  • Java仿12306图片验证码

    2022-09-29 05:36:08
  • spring springMVC中常用注解解析

    2023-09-14 20:45:46
  • asp之家 软件编程 m.aspxhome.com