美文网首页
MyBatis 中 # 与 $ 的区别

MyBatis 中 # 与 $ 的区别

作者: 小道萧兮 | 来源:发表于2019-08-14 16:03 被阅读0次

刚开始用 MyBatis 时,就发现有的地方用 #,有的地方用 $,但一直都没在意,直到程序出 Bug 了,才去了解。在项目中有个点击排序的功能调试了许久,终寻因,总结之。

需求是这样的,页面有个 table,有一列的上下箭头可点击并排序。对于这种需求,我的 mybatis.xml 的 SQL 配置写成了如下:

<if test="map.nameSort!=null and map.nameSort!=''"> 
  ORDER BY columnName #{map.nameSort} 
</if>

nameSort 即前端传的排序方式,ascdesc

预期的输出应该是这样的:ORDER BY columnName desc

但是,真正跑起来时,排序的效果一直没出现,经常一番查找,发现是 MyBatis 的 #{} 传值的问题,它将 SQL 语句编译成了如下:

ORDER BY columnName 'desc' 或者 ORDER BY columnName 'asc'

这样,descasc 就成了字符串,而不是关键字,SQL 语句的意思就全变了。

排序没效果的问题找到原因了,解决之,MyBatis 提供了另一种绑定参数的方式 ${param},将 SQL 配置改为:ORDER BY columnName ${map.nameSort}

这样一来,MyBatis 会直接将 nameSort 的值加入 SQL 中,不会转义。正确结果:ORDER BY columnName desc

最后,对于 MyBatis 中 #$ 绑定参数的区别做个总结:

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

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

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

  4. ${} 方式无法防止 SQL 注入。

  5. ${} 方式一般用于传入数据库对象,例如传入表名,需要注意的是如果传入表名,一定要用 ${},而不能用 #{},因为 #{} 会给表名加上引号,如 "tableName",SQL 中表名不能加引号(可以加反引号)。

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

相关文章

  • Q&A-06 Mybatis

    Mybatis中#{}与${}的区别 #{}1、#{} 是 sql 的参数占位符,Mybatis 会将 sql 中...

  • MyBatis学习笔记

    Mybatis架构图 图中可能有错误,欢迎评论指正。 1.# Mybatis 中$与#的区别 Mybatis中#是...

  • mybatis中#与$的区别

    mybatis中#与$的区别 MyBatis中使用parameterType向SQL语句传参,parameterT...

  • MyBatis中#与$的区别

    在mybatis的映射配置文件中经常可以看到#与$符号,这两种符号都是用于传递参数,那么它们之间的区别是什么呢? ...

  • MyBatis 中 # 与 $ 的区别

    刚开始用 MyBatis 时,就发现有的地方用 #,有的地方用 $,但一直都没在意,直到程序出 Bug 了,才去了...

  • Mybatis中#{}与${}的区别

    1.#{}1.MyBatis会把这个表达式使用?(占位符)替换,作为一个sql参数使用:推荐使用。比如: 定义SQ...

  • Mybatis

    mybatis 与 hibernate 区别 : mybatis 相比于hibernate 需要关心很多细节 ...

  • Mybatis配置中#{}与${}的区别

    **#{} ** (1)防止sql注入。使用#{}意味着使用的预编译的语句,即在使用jdbc时的preparedS...

  • mybatis中#{}与¥{}的区别

    简单来说#{} 解析的是占位符?可以防止SQL注入, 比如打印出来的语句 select *from table w...

  • mybatis中#与$的使用区别

    关键词,预编译,防sql注入,动态sql 我们在使用mybatis中编写sql语句的时候,经常会使用#或者$来取值...

网友评论

      本文标题:MyBatis 中 # 与 $ 的区别

      本文链接:https://www.haomeiwen.com/subject/uwogjctx.html