编写SQL语句时,#{} 和 ${}的区别
#{ }:参数占位符(推荐使用)
- 处理方式:MyBatis 会将
#{}
替换为 SQL 中的 ? 占位符,然后通过 PreparedStatement 的 setXxx () 方法设置参数(预编译处理)。
- 安全性:能自动防止 SQL 注入(因为参数是通过预编译传入,而非直接拼接 SQL)。
- 适用场景:大多数参数传递(如查询条件、插入值等)。
示例:
xml
<!-- Mapper.xml 中 -->
<select id="getUser" resultType="User">SELECT * FROM user WHERE id = #{userId}
</select>
MyBatis 会将其转换为预编译 SQL:
sql
SELECT * FROM user WHERE id = ?
${ }:字符串拼接(谨慎使用)
- 处理方式:MyBatis 会直接将
${}
替换为参数的字符串值,相当于直接拼接 SQL(无预编译)。 - 安全性:无法防止 SQL 注入(参数会被原样代入 SQL)。
- 适用场景:需要动态拼接 SQL 关键字的场景(如排序字段、表名等,这些无法用
#{}
实现)。
示例:
xml
<!-- Mapper.xml 中 -->
<select id="getUsers" resultType="User">SELECT * FROM user ORDER BY ${sortField}
</select>
若 sortField
的值是 "name DESC"
,拼接后 SQL 为:
sql
SELECT * FROM user ORDER BY name DESC