mybatis框架order by作为参数传入时失效的解决

 更新时间:2021年06月16日 15:15:18   作者:alwaysBrother  
这篇文章主要介绍了mybatis框架order by作为参数传入时失效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mybatis order by作为参数传入失效

mxl中的语句如下

<select id="statToday" resultType="com.dahua.la.business.model.vo.StatSysResultVO">
      select a,
             b,
        count(1) as total
      from table
      where  a is not null
      and b is not null
      and operateTime >= #{startTime,jdbcType=TIMESTAMP}
      and operateTime <= #{endTime,jdbcType=TIMESTAMP}
      group by a, b
   order by
   <foreach collection="orderItems" item="item" separator=",">
      #{item.orderBy} #{item.order}
   </foreach>
</select>

运行时通过日志打印出sql日志如下

select a, b, count(1) as total 
from table 
where a is not null and b is not null 
and operateTime >= ? and operateTime <= ? 
group by a, b 
order by ? ?

把参数补充上拿到Navicat执行的时候,完全没有问题,排序也正常。

但是在代码里执行就是不行, 最后的排序完全没有生效。

实际上,我补上参数的时候漏了引号,因为#{item.orderBy}会对传入的数据加一个引号,如果带着引号去Navicat执行,也是排序不生效的。

问题原因找到了

直接替换成使用${item.orderBy}形式,单纯的字符串替换不加引号。

<foreach collection="orderItems" item="item" separator=",">
    ${item.orderBy} ${item.order}
</foreach>

此时程序正常。

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

字符串替换

默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。

这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。

比如,像ORDER BY,你可以这样来使用:

ORDER BY ${columnName}

这里MyBatis不会修改或转义字符串。

重要:

接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。

这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

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

相关文章

  • Java StringUtils字符串分割转数组的实现

    Java StringUtils字符串分割转数组的实现

    这篇文章主要介绍了Java StringUtils字符串分割转数组的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Spring使用event-stream进行数据推送

    Spring使用event-stream进行数据推送

    这篇文章主要介绍了Spring使用event-stream进行数据推送,前端使用EventSource方式向后台发送请求,后端接收到之后使用event-stream方式流式返回,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2024-03-03
  • 使用Spring实现@Value注入静态字段

    使用Spring实现@Value注入静态字段

    这篇文章主要介绍了使用Spring实现@Value注入静态字段方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 解决Intellij IDEA运行报Command line is too long的问题

    解决Intellij IDEA运行报Command line is too long的问题

    这篇文章主要介绍了解决Intellij IDEA运行报Command line is too long的问题,本文通过两种方案给大家详细介绍,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 在springboot项目中同时接收文件和多个参数的方法总结

    在springboot项目中同时接收文件和多个参数的方法总结

    在开发接口中,遇到了需要同时接收文件和多个参数的情况,可以有多种方式实现文件和参数的同时接收,文中给大家介绍了两种实现方法,感兴趣的同学跟着小编一起来看看吧
    2023-08-08
  • 浅谈mybatis如何半自动化解耦(推荐)

    浅谈mybatis如何半自动化解耦(推荐)

    这篇文章主要介绍了浅谈mybatis如何半自动化解耦,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Spring Boot多模块化后,服务间调用的坑及解决

    Spring Boot多模块化后,服务间调用的坑及解决

    这篇文章主要介绍了Spring Boot多模块化后,服务间调用的坑及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java中的System.getProperty()详解

    Java中的System.getProperty()详解

    System.getProperty("XXX")方法用来读取JVM中的系统属性,那么java 虚拟机中的系统属性使用在运行java程序的时候java -D配置,有两种方式,一种是在命令行配置另一种是在IDE中配置,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2023-09-09
  • 解决idea找不到setting.xml文件的问题

    解决idea找不到setting.xml文件的问题

    这篇文章主要介绍了解决idea找不到setting.xml文件的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • java读取文件内容为string字符串的方法

    java读取文件内容为string字符串的方法

    今天小编就为大家分享一篇java读取文件内容为string字符串的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07

最新评论