Mybatis使用order by排序使用#无法正确执行的解决之#与$的区别
来源:互联网 发布:个人淘宝店铺转让 编辑:程序博客网 时间:2024/06/15 19:56
今天遇到一个问题,mysql数据库使用mybatis在mapper.xml写动态sql order by无法正确使用,没有报错,看日志也是传入了值
后来自己修改order by传入的值,发现对sql没有影响,说明这个sql没有正确执行
首先sql是这样写的
order by #{ORDER_BY}
外部定义是
private static final String ORDER_BY = "name ASC";
查看日志
Parameters: name ASC(String), 0(Integer), 10(Integer)
看到ORDER_BY的确传进来了,就是这个name ASC(String),但是它是String类型的,这时sql语句为 order by "name ASC",
大家可以在mysql里面直接这样写写,sql语句会执行,但是没有作用,也不会报错
下面改成
order by ${ORDER_BY}
查看日志Parameters: 0(Integer), 10(Integer)
没有了name ASC(String) 但是结果正确执行了
网上查找资料:
(1)对于形如#{variable} 的变量,Mybatis会将其视为字符串值,在变量替换成功后,缺省地给变量值加上引号。"variable"
(2)对于形如${variable}的变量,Mybatis会将其视作直接变量,即在变量替换成功后,不会再给其加上引号。 variable
所以在动态sql中,#{variable} 需要去掉 "",比如正常sql赋值一般是这样的and name= #{name},因为是=赋值,所以会获取内容,去掉""
${variable}可以直接使用,比如order by ${name} 传入的直接是name,不带双引号,可以直接使用,
并且order by不是 =赋值,所以如果直接order by #{name},结果是order by "name",自然无法执行了
总结,#{variable} 传入字符串,可以在日志查看到传入的参数,需要赋值后使用,可以有效防止sql注入
${variable}是直接传入变量,在日志查看不到传入的变量,直接在sql中执行,无法防止sql注入
所以,尽量用#{variable}格式,如果不是类似=赋值后再使用的sql,需要使用${variable}
网上还说有<![CDATA[]]>内需要注意#与$的区别,暂时没遇到,先备注一下。
- Mybatis使用order by排序使用#无法正确执行的解决之#与$的区别
- MyBatis排序时使用order by 动态参数时需要注意,用$而不是#, #{}和${}的区别以及order by注入问题
- oracle 数据库 order by 排序的使用
- mysql :group by 与order by 共同使用时排序问题,小心utf8的排序
- order by的使用
- Order By 的使用
- order by的使用
- sql中order by与索引排序的区别
- order by 与group by的区别!
- 查询之order by,group by和having的使用
- 查询之order by,group by和having的使用
- 查询之order by,group by和having的使用
- 查询之order by,group by和having的使用 .
- Hibernate 使用Order by 排序时的一个bug
- 解决distinct与order by 的冲突
- hive的strict模式;where,group by,having,order by同时使用的执行顺序
- Thinkphp 无法使用->order() 排序的两种解决办法!
- oracle order by与union一起使用的用法
- AOP面向切面编程
- 南阳理工OJ915解题报告
- FTPrep, 80 Remove Duplicates from Sorted Array II
- qt 创建插件和使用
- Linux C服务器开发需要注意的问题
- Mybatis使用order by排序使用#无法正确执行的解决之#与$的区别
- Java Calendar 类用例(处理时间)
- 正则表达式教程
- Eclipse 安装Spring Tool Suite(STS)
- mia
- CSS基础3
- ajax解析json字符串
- 接口回调的重要四步
- Ubuntu中一些有趣酷炫的命令o( ̄ヘ ̄o#)