Mybatis排序无效问题解决
在 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排序无效问题解决的更多相关文章
- mybatis动态sql排序无效
order by 字段,在用动态sql时会出现问题,排序无效,而且在日志里查询不到,不能发现这个错误. 通常,咱们的动态sql一般都会用#代替$,因为#可以防止sql注入问题. 但是在order by ...
- mybatis排序
排序的时候#和$的分别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by ...
- javascript 中设置window.location.href跳转无效问题解决办法
javascript 中设置window.location.href跳转无效问题解决办法 问题情况 JS中设置window.location.href跳转无效 原因是 a标签的href跳转会执行在wi ...
- mybatis出现无效的列类型
package com.webapp.hanqi.test; import java.util.Date; import org.junit.jupiter.api.AfterEach; import ...
- struts2 标签变形和 样式class无效 问题解决方法
在jsp使用Struts2标签的时候会发现,出现严重变形问题. <s:textfield type="text" name="username" labe ...
- Centos 7.0设置/etc/rc.local无效问题解决
安装centos7以后按照以往习惯修改rc.local添加开机启动命令,但重启后发现无效,再次重启发现依然如故 检查系统rc.local服务运行情况 systemctl | grep "rc ...
- div宽度设置无效问题解决
问题描述: 要设置两个div在同一行显示,都加入了display:inline样式,但是其中一个div的宽度设置无效,在浏览器显示它的宽度始终是1003px. 解决办法: 方法1/给div加入样式:f ...
- 关于label和span设置width无效问题解决方法
转:http://www.jb51.net/web/113507.html 大家可能不知道默认情况下label.span 设置width 是无效的,只有当display:block时,我们所设置的wi ...
- 技嘉 gigabyte b75m d3v 主板 定时开机无效问题解决
BIOS 里面设置定时开机后发现到点并没有正常启动~~~ 百思不得解.后来发现原来是WIN8系统下的控制面板的关机并非正常关机,而是不保存设置的非正常关机,在开始菜单右键——关闭或注销——关闭计算机 ...
随机推荐
- _itemmod_extra_equipments
双甲 可以控制获得属性的倍率,及是否可以取回物 `stat_muil`属性倍率(item_template中stat) `enchant_muil`附魔效果中的属性倍率(一些附魔会提升属性,可在些配置 ...
- hashtable详解
hashtable也比称作哈希表,键值对或者关联数组 1. 先引用using System.Collections;命名空间 用于处理和表现key/value的键值对,其中key通常用来快速查找,同时 ...
- 力扣(LeetCode)453. 最小移动次数使数组元素相等
给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数.每次移动可以使 n - 1 个元素增加 1. 示例: 输入: [1,2,3] 输出: 3 解释: 只需要3次移动(注意每次移动 ...
- leecode第四十六题(全排列)
class Solution { public: vector<vector<int>> permute(vector<int>& nums) { int ...
- DOCTYPE的作用以及标准模式和兼容模式的区别
<!doctype>声明必须处于HTML文档的头部,在<html>标签之前,告知浏览器的解析器用什么文档标准解析这个文档.DOCTYPE不存在或格式不正确会导致文档以兼容模式呈 ...
- 虚拟机镜像压缩(qcow2,raw)
●qcow2 格式的压缩首先,需要对虚拟机系统的剩余空间写零操作: $ dd if=/dev/zero of=/zero.dat 删除 zero.dat$ rm /zero.dat关闭虚拟机,进入虚拟 ...
- Python Selenium 文件下载
Python Selenium 进UI自动化测试时都会遇到文件上传和下载的操作,下面介绍一下文件下载的操作 这里介绍使用FireFox浏览器进行文件下载的操作. 1.设置文件默认下载地址 如下图,fi ...
- laravel配置路由除了 / 都是404解决办法
1.php.ini开启phpopenssl 2.conf (nginx为例) location / { index index.html index.htm index.php l.php; #tr ...
- centos 7 安装TensorFlow
查看linux版本 uname -a 查看磁盘大小 准备好python 2.7 查看python版本 import sysprint sys.version print sys.version_in ...
- maven的安装以及问题
https://blog.csdn.net/machao0903/article/details/73368909https://www.cnblogs.com/jiejiecool/p/421885 ...