Mybatis # $ 区别
在MyBatis
中使用参数进行SQL
拼装经常会使用到#{var}
和${var}
两种参数的设置方式。下面是两种方式的不用之处:
#{var}
- 使用预编译的方式将参数设置到
SQL
语句中(相当于占位符?
)。 - 使用原生
JDBC
中的prepareStatrment
。 - 在一定程度上防止
SQL
注入的风险(无法避免%
的问题)。
- 使用预编译的方式将参数设置到
${var}
- 不适用预编译模式。
- 取出相应的值直接拼装到
SQL
语句当中。 - 会有
SQL
注入的安全问题。
${var}
的变量的替换阶段是在动态SQL
解析阶段,而#{var}
的变量的替换是在DBMS
中。
#{var}
取值是编译好SQL语句再取值。#{var}
将传入的数据都当成一个字符串,对自动传入的数据加一个双引号。
如:order by #{id}
,传入的值为abc
,解析后的SQL为order by 'abc'
。${var}
是取值以后再去编译SQL
语句。${var}
将传入的数据直接显示生成在SQL
中,参数不带引号。
如:order by ${id}
,传入的值为abc
,解析后的SQL为order by 'bc
。
在原生JDBC
不支持占位符的地方,就不能使用#{var}
的形式去进行取值,会导致执行SQL
的时候报错。比如数据库表名、排序方式等特殊情况, 都需要使用${var}
的形式直接取值。SELECT xxx FROM ${tableName} WHERE id = #{id} order by ${columnName} ${order}
还没有评论,来说两句吧...