广告
返回顶部
首页 > 资讯 > 后端开发 > Python >mybatis框架order by作为参数传入时失效的解决
  • 464
分享到

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

2024-04-02 19:04:59 464人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

mybatis order by作为参数传入失效 mxl中的语句如下 <select id="statToday" resultType="com.dahua.l

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注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: mybatis框架order by作为参数传入时失效的解决

本文链接: https://www.lsjlt.com/news/128337.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作