zoukankan      html  css  js  c++  java
  • MyBatis 中#与$的区别

    需求是这样的,页面有个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语句,比如要执行一个存储过程。

  • 相关阅读:
    VC++ 调用C# dll 回调函数,实现MQTT协议客户端通信
    如何正确获取ADO连接MySql的连接字符串(转载)
    SQL 操作
    MFC如何添加背景图片(转载)
    MFC CFont 要释放的资源总结
    MFC控件 Edit,控制只能输入数字和小数点
    VC MFC 获取 IP地址和MAC地址程序
    MFC CString 转 CTime
    vc mfc 写excel文件,包括数据和图表
    ADO方式操作access数据库
  • 原文地址:https://www.cnblogs.com/meishibiexuejava/p/8514711.html
Copyright © 2011-2022 走看看