MyBatis 中#与$的区别
来源:互联网 发布:公交线路优化调整方案 编辑:程序博客网 时间:2024/06/14 22:43
http://blog.csdn.net/u011519624/article/details/54674670
今天在工作中有个点击排序的功能调试了许久,终寻因,总结之。
需求是这样的,页面有个table,有一列的上下箭头可点击并排序。对于这种需求,我的mybatis.xml的sql配置写成了如下:
<if test="map.ColumnNameSort!=null and map.ColumnNameSort!=''"> ORDER BY columnName #{map.ColumnNameSort} </if>
ColumnNameSort即前端传的排序方式,asc或者desc。
然后,预计它的输出应该是类似于下面这样的
ORDER BY columnName desc
但是,真正跑起来时,排序的效果一直没出现,经常一番查找,发现是mybatis 的’#{}’传值的问题,它将sql语句编译成了如下
ORDER BY columnName ‘desc’ 或者 ORDER BY columnName ‘asc’
这样,desc或者asc就成了字符串而不是关键字,sql语句的意思是columnName的别名是desc或者asc,没加排序关键字时默认是正序排序,成了如下
ORDER BY columnName "desc" asc 或者 ORDER BY columnName "asc" asc
排序没效果的问题找到原因了,解决之,mybatis提供了另一种绑定参数的方式–${param},将sql配置改为
ORDER BY columnName ${map.ColumnNameSort}
这样一来,mybatis会直接将ColumnNameSort的值加入sql中,不会转义。正确结果:
ORDER BY columnName desc
最后,对于mybatis中#和$绑定参数的区别做个总结,避免以后类似的问题发生。
- #{}将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by
#{id},如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”。 ${}将传入的数据直接显示生成在sql中。如:order by ${id},如果传入的值是111,那么解析成sql时的值为order
by 111, 如果传入的值是id,则解析成的sql为order by id。- #方式能够很大程度防止sql注入。
- $方式无法防止Sql注入。
- $方式一般用于传入数据库对象,例如传入表名.
- 一般能用#的就别用$
ps:在使用mybatis中还遇到<![CDATA[]]>
的用法,在该符号内的语句,将不会被当成字符串来处理,而是直接当成sql语句,比如要执行一个存储过程。
阅读全文
0 0
- mybatis 中#与$的区别
- Mybatis 中 $ 与 # 的区别
- mybatis 中#与$的区别
- mybatis 中#与$的区别
- mybatis 中#与$的区别
- mybatis 中#与$的区别
- mybatis 中#与$的区别
- mybatis 中#与$的区别
- mybatis 中#与$的区别
- mybatis 中#与$的区别
- mybatis 中#与$的区别
- mybatis 中#与$的区别
- mybatis 中#与$的区别
- mybatis 中#与$的区别
- mybatis 中#与$的区别
- mybatis 中#与$的区别
- mybatis 中#与$的区别
- mybatis 中#与$的区别
- view 事件体系
- 最小生成树
- zedboard qspi flash 分区,更新bin文件,上电启动
- Python 类简要学习
- android 获取动态解析后的html
- MyBatis 中#与$的区别
- Digester 类解析 xml 文件
- python学习笔记之001.py
- Let the Balloon Rise
- 用java实现一颗平衡二叉树ADT
- 装饰器模式
- TCP并发服务器,每个客户一个子进程
- 在 spring mvc 中使用 swagger2
- 用户模式下的线程同步——Slim读/写锁