Mybatis-plus foreach拼接字符串查询无数据返回问题

 更新时间:2022年03月22日 15:59:04   作者:轻点 别打脸  
这篇文章主要介绍了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而言,每一个考点背后都是有一个深刻的思想存在的,应该好好的体会。这样才能真正的做到技术提升,成为技术大牛。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • PowerJob的OmsLogHandler工作流程源码解析

    PowerJob的OmsLogHandler工作流程源码解析

    这篇文章主要为大家介绍了PowerJob的OmsLogHandler工作流程源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • SpringBoot中@Insert、@Update实现批量新增更新的使用示例

    SpringBoot中@Insert、@Update实现批量新增更新的使用示例

    本文主要介绍了SpringBoot中@Insert、@Update实现批量新增更新的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-10-10
  • 浅谈Thread.sleep(0)到底有什么用

    浅谈Thread.sleep(0)到底有什么用

    为什么要用sleep,主要是为了暂停当前线程,把cpu片段让出给其他线程,减缓当前线程的执行,本文主要介绍了Thread.sleep(0)到底有什么用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 详解spring security filter的工作原理

    详解spring security filter的工作原理

    这篇文章主要介绍了详解spring security filter的工作原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • java8升级java21方法步骤(完整pom文件升级及代码修改)

    java8升级java21方法步骤(完整pom文件升级及代码修改)

    在从Java 8升级至Java 211的过程中,需要对多个POM文件进行升级,涉及parent、web、service等模块,文中通过代码介绍的非常详细,对大家学习或者使用java具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-11-11
  • Java使用Queryable-pageable实现分页效果

    Java使用Queryable-pageable实现分页效果

    这篇文章主要为大家介绍了Java如何使用Queryable-pageable从而实现分页效果,文中的示例代码简洁易懂,感兴趣的小伙伴可以动手尝试一下
    2022-06-06
  • Java如何自动生成api文档

    Java如何自动生成api文档

    在 Java 开发中,自动生成 API 文档是一项非常实用的功能,这篇为大家介绍了几种常见的 Java 自动生成 API 文档的方式,需要的可以参考一下
    2025-02-02
  • SpringBoot集成gRPC微服务工程搭建实践的方法

    SpringBoot集成gRPC微服务工程搭建实践的方法

    这篇文章主要介绍了SpringBoot集成gRPC微服务工程搭建实践的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • 在X分钟内学会C#的入门简明教程

    在X分钟内学会C#的入门简明教程

    C#是一个优雅的、类型安全的面向对象语言。使用C#,开发者可以在.NET框架下构建安全而强大的应用程序,阅读本文可以快速的入门C#编程语言,需要的朋友可以参考下
    2014-03-03
  • Java高效实现电商产品排序实战

    Java高效实现电商产品排序实战

    这篇文章主要为大家介绍了Java高效实现电商产品排序实战,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11

最新评论