Java MyBatis 中 #{}和 ${}的区别是什么?

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 注入攻击。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习资源网

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值