mybatis #{} ${} 说明

mybatis中#{}和${}的区别sql

  1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,若是传入的值是111,那么解析成sql时的值为order by "111", 若是传入的值是id,则解析成的sql为order by "id".   
  2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,若是传入的值是111,那么解析成sql时的值为order by user_id, 若是传入的值是id,则解析成的sql为order by id.   
  3. #方式可以很大程度防止sql注入。    4.$方式没法防止Sql注入。

5.$方式通常用于传入数据库对象,例如传入表名.    6.通常能用#的就别用$.数据库

MyBatis排序时使用order by 动态参数时须要注意,用$而不是#安全

字符串替换 默认状况下,使用#{}格式的语法会致使MyBatis建立预处理语句属性并以它为背景设置安全的值(好比?)。这样作很安全,很迅速也是首选作法,有时你只是想直接在SQL语句中插入一个不改变的字符串。好比,像ORDER BY,你能够这样来使用: ORDER BY ${columnName} 这里MyBatis不会修改或转义字符串。mybatis

重要:接受从用户输出的内容并提供给语句中不变的字符串,这样作是不安全的。这会致使潜在的SQL注入攻击,所以你不该该容许用户输入这些字段,或者一般自行转义并检查。code

我以为#与$的区别最大在于:#{} 传入值时,sql解析时,参数是带引号的,而${}穿入值,sql解析时,参数是不带引号的。对象

一 : 理解mybatis中 $与#排序

在mybatis中的$与#都是在sql中动态的传入参数。

eg:select id,name,age from student where name=#{name}  这个name是动态的,可变的。当你传入什么样的值,就会根据你传入的值执行sql语句。

二:使用$与#字符串

#{}: 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符 。string

${}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。编译

name-->cy

eg: select id,name,age from student where name=#{name} -- name='cy'

select id,name,age from student where name=${name}    -- name=cy

sql语句中#{}表示一个占位符。

相关文章
相关标签/搜索