在MyBatis中,#{}和${}是用于传递参数的两种不同的语法格式,它们在处理参数值的方式上有一些关键的区别:
-
#{}:预编译参数(PreparedStatements)
#{}语法会在 SQL 中使用预编译的方式,会把传入的值当作一个参数,并使用 JDBC 的预编译语句(PreparedStatement)来处理,这样可以防止 SQL 注入攻击。#{}中的值会被自动添加单引号,因此不论传入的是什么类型的值,MyBatis 都会将其转换为字符串。#{}可以防止 SQL 注入,因为预编译的方式会把传入的参数值当作一个整体,而不是 SQL 语句的一部分。
示例:
SELECT * FROM user WHERE id = #{userId} -
${}:字符串替换
${}语法会把传入的值直接拼接到 SQL 语句中,它是字符串替换的方式。${}中的值不会被添加单引号,因此如果传入的是字符串,需要在 SQL 语句中手动添加单引号。- 使用
${}时要注意 SQL 注入的风险,因为传入的值直接被拼接到 SQL 语句中,可能受到恶意输入的影响。
示例:
SELECT * FROM user WHERE id = ${userId}
总结:
- 使用
#{}可以防止 SQL 注入,适用于大多数的 SQL 参数。 - 使用
${}适用于一些特殊场景,比如动态表名、字段名等,但需要谨慎防范 SQL 注入的风险。 - 在普通的查询、插入、更新等操作中,推荐使用
#{}。