Mybatis使用order by排序使用#无法正确执行的解决之#与$的区别
2017-09-20 13:49
375 查看
今天遇到一个问题,mysql数据库使用mybatis在mapper.xml写动态sql order by无法正确使用,没有报错,看日志也是传入了值
后来自己修改order by传入的值,发现对sql没有影响,说明这个sql没有正确执行
首先sql是这样写的
外部定义是
查看日志
看到ORDER_BY的确传进来了,就是这个name ASC(String),但是它是String类型的,这时sql语句为 order by
"name ASC",
大家可以在mysql里面直接这样写写,sql语句会执行,但是没有作用,也不会报错
下面改成
没有了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[]]>内需要注意#与$的区别,暂时没遇到,先备注一下。
后来自己修改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[]]>内需要注意#与$的区别,暂时没遇到,先备注一下。
相关文章推荐
- 使用复制存储过程执行解决“事务复制中的表大量更新导致无法及时同步”的问题
- 两台计算机互联,其中一台能ping通另一台却无法连通,执行Ping成功而网络无法使用 的解决
- 使用proxy解决nginx alias无法执行PHP等fastcgi问题
- 亚马逊ec2服务器上无法使用sudo执行npm命令的解决办法
- 应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行sxstrace.exe工具。解决方法
- 使用复制存储过程执行解决“事务复制中的表大量更新导致无法及时同步”的问题
- 解决Eclipse+Pydev使用tornado框架应无法正确import tornado包错误
- Mybatis 中sql 使用in(#{item})无法查询解决办法
- nginx 配置正确但无法正确执行php脚本[解决步骤]
- 用非GUI模式执行测试,jp@gc - PerfMon Metrics Collector会出现无法获取正确数据的解决办法
- tp中save代码正确,无法执行问题,删除缓存试试.---根本的解决办法还需要思考
- 在该控件上执行的操作正从错误的线程调用。使用 Control.Invoke 或 Control.BeginInvoke 封送到正确的线程才能执行此操作。(以解决)
- mybatis 使用dblink 执行insert 报ora-22816 returning 子句不支持的功能问题解决方法
- 关于BLEserver端的代码广播使用无法正确执行Response
- 使用复制存储过程执行解决“事务复制中的表大量更新导致无法及时同步”的问题 (转)
- 程序打包,"错误:应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行sxstrace.exe"工具解决办法
- 使用VS2003遇到“无法显示进程。没有正确安装调试器。请运行安装程序安装或修复调试器。”的解决方法
- 解决Eclipse+Pydev使用tornado框架应无法正确import tornado包错误
- Web app 前端框架ratchet使用push.js界面跳转后,js代码无法执行的解决方法