mybatis框架order by作为参数传入时失效的解决 程序员文章站 2022-06-17 22:51:17 mybatis order by作为参数传入失效mxl中的语句如下 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注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。 以上为个人经验,希望能给大家一个参考,也希望大家多多支持。 相关标签: mybatis orderby 参数 传入 上一篇: 所有供应链都值得重做一遍?两大链路、十个模块,实战总结来了 下一篇: 这3个Python实时可视化工具包来帮你了解性能瓶颈 推荐阅读 mybatis框架order by作为参数传入时失效的解决 mybatis框架order by作为参数传入时失效的解决