今天在工作中有个点击排序的功能调试了许久,终寻因,总结之。 
  需求是这样的,页面有个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中#和$绑定参数的区别做个总结,避免以后类似的问题发生。

  1. #{}将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{id},如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”。

  2. ${}将传入的数据直接显示生成在sql中。如:order by 
    ${id},如果传入的值是111,那么解析成sql时的值为order by 111, 如果传入的值是id,则解析成的sql为order 
    by id。

  3. #方式能够很大程度防止sql注入。

  4. $方式无法防止Sql注入。

  5. $方式一般用于传入数据库对象,例如传入表名.

  6. 一般能用#的就别用$.

ps:在使用mybatis中还遇到<![CDATA[]]>的用法,在该符号内的语句,将不会被当成字符串来处理,而是直接当成sql语句,比如要执行一个存储过程。

最新文章

  1. python之数据库操作
  2. 微软良心之作——Visual Studio Code 开源免费跨平台代码编辑器
  3. .Net core Linux环境安装
  4. zabbix自定义监控tcp连接数
  5. Linux TCP/IP 协议栈之 Socket 的实现分析(一)
  6. 编译安装MongoDB C++ Driver (win8.1 vs2013)
  7. 【WCF】错误处理(二):错误码―—FaultCode
  8. python 初学之账户登录
  9. 分享:Python中的位运算符
  10. Gym - 101982C Contest Setting (动态规划)
  11. 以方法调用的原理解释Ruby中“puts ‘Hello‘”
  12. 教女朋友写第一个php
  13. Spark记录-Scala程序例子(函数/List/match/option/泛型/隐式转换)
  14. bzoj1485: [HNOI2009]有趣的数列(Catalan数)
  15. CentOS 安装 Python3
  16. windows开通https服务
  17. python读取文件行号和内容的便捷方法
  18. 操作系统的三个接口 shell gui api
  19. 《Java程序猿面试笔试宝典》之组合与继承有什么差别
  20. ssh整合(dao使用hibernateTemplate)

热门文章

  1. Python中的import
  2. iOS-----使用NSURLConnection
  3. PLsql登录数据库提示密码即将过期-
  4. opencv2.4.10与VS2013的环境配置
  5. DelaunayTriangulation_VoronoiDiagram_using_OpenCV的实现
  6. 【知识笔记】Debugging
  7. java内存的分配和管理
  8. JS 得细心的坑位
  9. hadoop 知识点
  10. logging 的配置和使用