在 MyBatis 中,#{}
和 ${}
是用于在 SQL 语句中传递参数的两种不同的占位符方式,它们有以下区别:
#{}
- 安全性高:
#{}
中的值会被预编译成占位符,MyBatis 会使用 PreparedStatement,并为每个参数设置占位符,可以防止 SQL 注入攻击。 - 参数替换:
#{}
能够将传入的参数按照预定义的 JDBC 类型进行处理和转换,通常用于设置 SQL 的参数,例如WHERE column = #{value}
。
${}
- 字符串替换:
${}
中的值会直接替换成传入的值,直接拼接到 SQL 语句中,不进行预编译,可能导致 SQL 注入的风险。 - 用途:
${}
通常用于动态传递 SQL 语句的表名、字段名等不需要预编译的部分,如SELECT * FROM ${tableName}
。
示例:
假设有一个参数 name = "John"
。
- 使用
#{}
:WHERE name = #{name}
会将name
作为预编译参数,安全性高,生成的 SQL 为WHERE name = ?
。 - 使用
${}
:WHERE name = '${name}'
会直接替换成字符串,生成的 SQL 为WHERE name = 'John'
,存在 SQL 注入的风险。
在实际使用时,推荐使用 #{}
,它提供了更高的安全性和预编译功能,有助于避免潜在的安全风险。而 ${}
则更适合于那些不需要预编译的场景,如表名、列名等动态部分。
Was this helpful?
0 / 0