在 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