Mybatis中#和$的区别

在MyBatis中,#{} 和 ${} 是两种用于参数替换的占位符,但它们在处理方式和安全性上有所不同

#{}

预编译处理:MyBatis在处理#{}时,会将其中的内容作为参数进行预编译处理。这意味着MyBatis会生成一个PreparedStatement对象(预编译的SQL语句),并将#{}中的内容作为参数传递给这个对象。因此,当SQL语句执行时,参数会被直接设置到SQL语句中,而不是替换整个占位符。

举例:

<select id="selectUserById" resultType="User">  
    SELECT * FROM users WHERE id = #{userId}  
</select>
  • 在这个例子中,#{userId} 是一个占位符,它会被预处理为一个参数占位符(通常被替换为 ?),也就是说 SELECT * FROM users WHERE id = #{userId} 会被替换为 SELECT * FROM users WHERE id = ?
  • 并且MyBatis会使用PreparedStatement的set方法来为这个占位符设置值。
  • 当调用这个方法时,你通常会传递一个参数给 selectUserById 方法,这个参数会被MyBatis自动绑定到 #{userId} 占位符上。

性能更高

  • 当SQL语句被预编译后,其编译后的版本会被缓存起来。
  • 后续再次执行相同的SQL语句时,数据库服务器会直接从缓存中取出编译后的版本,而无需再次进行编译。
  • 这减少了编译所需的计算资源和时间,从而提高了性能。

防止SQL注入:由于#{}使用了预编译的方式,它会自动处理参数中的特殊字符,如引号、分号等,从而防止了SQL注入攻击。

举例:

        如果我们传递一个参数值userId为 1' OR '1'='1(这是一个常见的SQL注入攻击尝试),MyBatis会将其绑定到SQL语句中,生成的实际执行的SQL语句将类似于:

        SELECT * FROM users WHERE id = ?

        参数1' OR '1'='1会被作为一个普通的参数值传递,数据库会正确地将其当作一个字符串值来处理,而不会执行任何SQL注入代码。(由于使用了参数绑定,这个字符串值不会被当作SQL语句的一部分来解析和执行。相反,它会被当作一个普通的字符串值来与数据库中的列值进行比较。

      

${}

字符串替换:与#{}不同,MyBatis在处理${}时,会将其中的内容直接替换到SQL语句中,而不是作为参数传递。这意味着${}中的内容会原样输出到SQL语句中,因此需要注意特殊字符和SQL注入的问题。

举例:

<select id="selectUserByName" resultType="User">  
    SELECT * FROM users WHERE name = '${userName}'  
</select>
  • 在这个例子中,${userName} 会被直接替换为实际的变量值。MyBatis不会对其进行任何预处理或转义。

SQL注入风险

        如果 userName 包含了恶意的SQL代码(如 ' OR '1'='1),那么这个SQL语句就会变成 SELECT * FROM users WHERE name = '' OR '1'='1',这将会返回表中的所有用户记录(因为'1'='1'是满足的)。

        在实际应用中,如果必须使用 ${}(例如在动态表名或列名的情况下),请确保传入的变量值是安全的、经过验证的,或者来自于受信任的来源。

总结

  • #{} 是安全的,因为它使用预编译的SQL语句和参数绑定。
  • ${} 是不安全的,因为它直接将变量值替换到SQL语句中,可能导致SQL注入。
  • 在大多数情况下,应该优先使用 #{} 而不是 ${}。当确实需要使用 ${} 时,请确保输入是安全的。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值