在 MyBatis 中,#{}
和 ${}
是用于在 SQL 语句中插入参数值的两种方式,它们之间有重要的区别:
#{}
的使用:
#{}
主要用于预编译的 SQL 语句中,它会将参数值以安全的方式插入 SQL 语句中,并自动进行参数的类型转换和防止 SQL 注入攻击。#{}
会将参数值包含在一个预编译的占位符中,由 MyBatis 负责处理参数值的安全拼接。${}
的使用:
${}
主要用于动态 SQL 语句中,它直接将参数值拼接到 SQL 语句中,不会进行预编译。${}
会将参数值原封不动地插入到 SQL 语句中,不会进行类型转换,也不会防止 SQL 注入攻击。因此,使用 ${}
时需要格外注意安全性。以下是一个简单的示例来说明它们的区别:
<!-- 使用 #{}, 预编译 SQL 语句,安全性较高 -->
<select id="getUserById" resultType="User">
SELECT * FROM users
WHERE id = #{userId}
</select>
<!-- 使用 ${}, 动态 SQL 语句,需要注意安全性 -->
<select id="getUserByName" resultType="User">
SELECT * FROM users
WHERE username = '${username}'
</select>
在上述示例中,#{userId}
使用了预编译的方式,而 ${username}
直接将参数值插入到 SQL 语句中。推荐在可能的情况下使用 #{}
,以提高 SQL 的安全性。在动态 SQL 的情况下,如果使用 ${}
,要确保参数值是安全的,避免 SQL 注入的风险。