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

网友投稿 264 2023-01-07

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

mybatis order by作为参数传入失效

mxl中的语句如下

select a,

b,

count(1) as total

from table

where a is not null

and b is not null

and operateTime >= #{startTime,jdbcType=TCvhGkLyIMESTAMP}

and operateTime <= #{endTime,jdbcType=TIMESTAMP}

group by a, b

order by

#{item.orderBy} #{item.order}

运行时通过日志打印出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执行的时候,完全没有问题,排序也正常。

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

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

问题原因找到了

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

${item.orderBy} ${item.order}

此时程序正常。

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

字符串替换

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

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

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

ORDER BY ${columnName}

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

重要:

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

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:把自己网站做成api接口(怎么制作自己的api)
下一篇:美团电商快递物流查询单号(美团电商快递物流查询单号怎么查)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~