- 区别
1.#{}
解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个#{ }
被解析为一个参数占位符;而${}
仅仅为一个纯碎的 string 替换,在动态SQL 解析阶段将会进行变量替换。
-
#{}
解析之后会将String类型的数据自动加上引号,其他数据类型不会;而${}
解析之后是什么就是什么,他不会当做字符串处理。 -
#{}
很大程度上可以防止SQL注入(SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作);而${}
主要用于SQL拼接的时候,有很大的SQL注入隐患。 -
在某些特殊场合下只能用
${}
,不能用#{}
。例如:在使用排序时ORDER BY ${id},如果使用#{id}
,则会被解析成ORDER BY “id”,这显然是一种错误的写法。