在 mybatis 的 xml中,为一个SQL语句配置order by 子句时,需要这个排序的字段是前端传递过来的,而且排序的顺序(升序 OR 降序)也是由前端传递过来的。对于这种需求,我起初写成了下面这样:

ORDER BY `#{condition.field}` #{condition.sortRule}
1
然后,预计它的输出应该是类似于下面这样的

ORDER BY `user_name` DESC
1
但是,真正运行时,你会发现,mybatis将会抛出异常,告诉你参数的个数不匹配。
我debug大概看了一下原因,对于上面这个SQL,mybatis会把它编译成:

ORDER BY `?` ?
1
然后,有两个待使用的参数值:

① condition.field = "user_name"
② condition.sortRule = "DESC"
1
2
但是,在替换参数时,由于第一个?是被 ` ` 包住的,而 ` ` 在MYSQL中就是用来括住字段名的(可以避免 与 SQL 关键字冲突等问题),所以,mybatis会把第一个?就当成是字段的名称,从而不会进行值的替换,只会用condition.field的值替换第二个?的值,变成:

ORDER BY `?` "user_name"
1
上面这个转换后的语句,我们会发现两个问题:

第一个?没有被替换
“user_name”带了一对“”
为了解决这两个问题,mybatis提供了另一种绑定参数的方式: ${param}

所以,现在,我们把原始的SQL语句改成如下:

ORDER BY `${condition.field}` ${condition.sortRule}
1
这个时候,我们就可以获得正确的结果了

ORDER BY `user_name` DESC
1
这个时候,也许有人会问,这种情况下,为什么第一个?会被替换掉呢?
对于这个问题,我也没有仔细调查,可能是mybatis的特殊处理吧。

最后,对于${ }的用法,需要注意以下几点:

$方式无法防止Sql注入,所以,对于使用前端传过来的值的时候,一定要进行转义,不要直接使用
一般能用#的就别用$。
$方式一般用于传入数据库对象,例如传入表名、排序规则等
---------------------
作者:rainbow702
来源:CSDN
原文:https://blog.csdn.net/rainbow702/article/details/53906763
版权声明:本文为博主原创文章,转载请附上博文链接!

Mybatis排序无效问题解决的更多相关文章

  1. mybatis动态sql排序无效

    order by 字段,在用动态sql时会出现问题,排序无效,而且在日志里查询不到,不能发现这个错误. 通常,咱们的动态sql一般都会用#代替$,因为#可以防止sql注入问题. 但是在order by ...

  2. mybatis排序

    排序的时候#和$的分别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by ...

  3. javascript 中设置window.location.href跳转无效问题解决办法

    javascript 中设置window.location.href跳转无效问题解决办法 问题情况 JS中设置window.location.href跳转无效 原因是 a标签的href跳转会执行在wi ...

  4. mybatis出现无效的列类型

    package com.webapp.hanqi.test; import java.util.Date; import org.junit.jupiter.api.AfterEach; import ...

  5. struts2 标签变形和 样式class无效 问题解决方法

    在jsp使用Struts2标签的时候会发现,出现严重变形问题. <s:textfield type="text" name="username" labe ...

  6. Centos 7.0设置/etc/rc.local无效问题解决

    安装centos7以后按照以往习惯修改rc.local添加开机启动命令,但重启后发现无效,再次重启发现依然如故 检查系统rc.local服务运行情况 systemctl | grep "rc ...

  7. div宽度设置无效问题解决

    问题描述: 要设置两个div在同一行显示,都加入了display:inline样式,但是其中一个div的宽度设置无效,在浏览器显示它的宽度始终是1003px. 解决办法: 方法1/给div加入样式:f ...

  8. 关于label和span设置width无效问题解决方法

    转:http://www.jb51.net/web/113507.html 大家可能不知道默认情况下label.span 设置width 是无效的,只有当display:block时,我们所设置的wi ...

  9. 技嘉 gigabyte b75m d3v 主板 定时开机无效问题解决

    BIOS 里面设置定时开机后发现到点并没有正常启动~~~  百思不得解.后来发现原来是WIN8系统下的控制面板的关机并非正常关机,而是不保存设置的非正常关机,在开始菜单右键——关闭或注销——关闭计算机 ...

随机推荐

  1. _itemmod_gem_remove

    该表可配置以一定代价移除宝石,移除后获得该宝石 `entry`宝石ID `reqId` 需求ID `chance`几率 `comond` 备注

  2. img 下方的4px像素问题

    问题:在一个div块里面放了一个图片,图片下面有内容,可以不管怎么调试,在火狐浏览器,IE6下.图片img底部多出了4个像素 解决:img样式中   vertical-align: top/middl ...

  3. 随机--相关(Fisher_Yates算法)

    Fisher_Yates算法   void ShuffleArray_Fisher_Yates(char* arr, int len) {     int i = len, j;     char t ...

  4. java创建线程的方法

    1.1      创建线程 1.1.1     无返回值的线程创建 package com.first; public class ThreadTest { public static void ma ...

  5. windows设置程序开机自启动

    在msconfig里面进行设置的前提是,这个程序已经在自启动列表中,只是没有被勾选上, 对于不在该启动列表里的程序需要: ①找到这个应用程序所在的位置; ②右击发送到桌面快捷方式;  ③在Window ...

  6. Codeforces 937D - Sleepy Game

    937D - Sleepy Game 思路: dfs. vis[u][0]==1表示u这个点能从s点偶数路径到达 vis[u][1]==1表示u这个点能从s点奇数路径到达 这个样就能保证dfs时每个点 ...

  7. 【转载】LINUX下安装wget命令(SFTP实现法)

    如何安装wget命令. 方法一:通过yum 命令行为:yum install wget 完成.此操作很简单,但是我安装的linux是centos的最小版本,运行上述命令时会出现无法连接到源网站(大概是 ...

  8. Getting Started with Processing 第四章总结

    为什么要使用变量: 我们使用变量的一个重要原因就是避免变成过程中的重复工作,如果你重复使用某一个数字超过了一次,就可以考虑使用一个变量来代替它,这样你的程序会更加通用并且易于更新. 定义变量 定义变量 ...

  9. 用R的igraph包来画蛋白质互作网络图 | PPI | protein protein interaction network | Cytoscape

    igraph语法简单,画图快速. Cytoscape专业,个性定制. 最终效果图: 当然也可以用Cytoscape来画. 参考:Network visualization with R Cytosca ...

  10. Shell Trap信号管理

    trap命令用于指定在接收到信号后将要采取的动作.常见的用途是在脚本程序被中断时完成清理工作.不过,这次我遇到它,是因为客户有个需求:从终端访问服务器的用户,其登陆服务器后会自动运行某个命令,例如打开 ...