Java MyBatis 中 #{}和 ${}的区别是什么?
2023-12-17 09:41:20
    		Java MyBatis 中 #{}和 ${}的区别是什么?
在 MyBatis 中,#{} 和 ${} 是两种不同的参数注入方式,主要区别在于参数的预处理和安全性。
#{} :预处理参数
 
- #{}用于预处理参数,会将参数值以预编译的形式传递给 SQL 引擎,防止 SQL 注入攻击。
<!-- 示例:使用#{}预处理参数 -->
<select id="getUserById" resultType="User">
    SELECT * FROM user WHERE id = #{userId}
</select>
在上面的例子中,#{userId} 会被 MyBatis 替换成 ?,然后在执行 SQL 语句时,将真正的参数值传递给 ? 进行预编译,这有助于防止 SQL 注入。
${}:直接拼接参数
 
- ${}用于直接拼接参数,将参数值直接替换到 SQL 语句中,不进行预处理。这样做可能会存在 SQL 注入的风险,因此要慎用。
<!-- 示例:使用${}直接拼接参数 -->
<select id="getUserByName" resultType="User">
    SELECT * FROM user WHERE name = '${userName}'
</select>
在上面的例子中,${userName} 会直接替换成实际的参数值,如果参数值包含恶意的 SQL 语句,可能导致 SQL 注入攻击。
区别总结:
- #{}用于预处理参数,安全性更高,可以防止 SQL 注入。
- ${}用于直接拼接参数,慎用,可能存在 SQL 注入的风险。
示例代码:
public interface UserMapper {
    // 使用#{}预处理参数
    @Select("SELECT * FROM user WHERE id = #{userId}")
    User getUserById(@Param("userId") int userId);
    // 使用${}直接拼接参数
    @Select("SELECT * FROM user WHERE name = '${userName}'")
    User getUserByName(@Param("userName") String userName);
}
上述示例代码展示了在 MyBatis 中使用 #{} 和 ${} 的方式。通常建议使用 #{} 以提高安全性,防止 SQL 注入攻击。
    			文章来源:https://blog.csdn.net/sanmansan/article/details/134918006
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
    	本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!