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[]]>内需要注意#与$的区别,暂时没遇到,先备注一下。




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 儿童安全锁的门打不开怎么办 守护宝老年机打不开了怎么办 小米电话手表坏了怎么办 小米手表带坏了怎么办 小米电话手表屏幕坏了怎么办 雷诺梅甘娜06款系统错乱怎么办 轿车碰了一个坑怎么办 车子卖了没过户怎么办 9岁儿童肠胃痉挛怎么办 鹿角胶水放多了怎么办 打胰岛素血糖还是高怎么办 血糖高打胰岛素降不下去怎么办 儿童低烧37度1怎么办 小孩发烧一会冷一会热怎么办 月子里得的风湿怎么办 腰窝中间凸起肉怎么办 线雕后一个月脸发红肿胀怎么办 雷诺氏病手指僵硬疼怎么办 哺乳妈妈吃咸了怎么办 吃流产药哺乳了怎么办 坐月子吃咸了怎么办啊 拔罐放血后头晕怎么办 e道航界面不动怎么办 微信必须打开位置权限怎么办 魅族sim卡未启用怎么办 苹果6sgps信号弱怎么办 苹果5s4g网络慢怎么办 苹果5s上网很慢怎么办 手机一体机死机关不了机怎么办 联想一体机关不了机怎么办 纸巾盒的吸盘老化了怎么办 粘的挂钩老掉怎么办 车载手机支架吸盘吸不住怎么办 吸盘吸不住怎么办才好? 行车记录仪吸盘吸不住怎么办 小米儿童手表二维码丢了怎么办 艾蔻手表二维码丢失了怎么办 玩具直升机遥控器坏了怎么办 玩具飞机遥控器坏了怎么办 玩具无人机遥控器坏了怎么办 玩具遥控车遥控器坏了怎么办