MyBatis 占位符 #{} 和 ${} 的区别:安全性和用途
在 MyBatis 中,'#' 和 '$' 都是占位符,但它们在处理参数时存在显著区别。
- '#' 占位符:'#' 是预编译的占位符,它会对传入的参数进行安全处理,有效防止 SQL 注入攻击。在执行 SQL 语句之前,MyBatis 会将 '#' 替换为一个占位符,并使用 PreparedStatement 的参数设置方法来设置实际参数值。
示例:
<select id="getUserById" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
在这个例子中,'#{id}' 会被替换为一个占位符,随后使用 PreparedStatement 的参数设置方法来设置实际的参数值。
- '$' 占位符:'$' 是字符串替换的占位符,它会直接将传入的参数值拼接到 SQL 语句中。使用 '$' 时,需要注意潜在的安全风险,因为参数值会直接插入到 SQL 语句中,可能导致 SQL 注入问题。
示例:
<select id="getUserByName" resultType="User">
SELECT * FROM users WHERE name = '${name}'
</select>
在这个例子中,'${name}' 会被替换为参数的实际值,直接拼接到 SQL 语句中。
因此,建议优先使用 '#' 占位符来处理参数,以避免安全问题。只有在需要动态拼接 SQL 语句时,才考虑使用 '$' 占位符。
原文地址: http://www.cveoy.top/t/topic/qzGI 著作权归作者所有。请勿转载和采集!