当前位置: 代码网 > it编程>编程语言>Java > MyBatis中 #{} 和 ${} 的区别小结

MyBatis中 #{} 和 ${} 的区别小结

2024年12月09日 Java 我要评论
在mybatis中,#{}和${}是两种常见的占位符,它们的作用和使用场景有所不同。理解它们的区别对于正确使用mybatis非常重要。在mybatis面试中常涉及到关于#{}和${}的区别1、#{}是

在mybatis中,#{}${}是两种常见的占位符,它们的作用和使用场景有所不同。理解它们的区别对于正确使用mybatis非常重要。

在mybatis面试中常涉及到关于#{}和${}的区别

1、#{}是预编译处理,$ {}是字符串替换。

2、mybatis在处理#{}时,会将sql中的#{}替换为?号,使用preparedstatement的set方法来赋值;mybatis在处理 $ { } 时,就是把 ${ } 替换成变量的值。

3、使用 #{} 可以有效的防止sql注入,提高系统安全性。

1. #{} 和 ${} 的基本区别

#{}:sql参数占位符

作用#{}用于将传入的参数安全地绑定到sql语句中,它会自动使用preparedstatement?占位符机制,并且mybatis会对传入的参数进行预处理(例如防止sql注入)。

参数替换:在生成sql语句时,#{}会被替换为一个?,然后由jdbc驱动程序将参数值绑定到这个?占位符上。

使用场景:通常用于传递用户输入的参数,如查询条件、插入或更新的数据等。

示例

<select id="finduserbyid" resulttype="user">
    select * from users where id = #{id}
</select>
  • 如果传入的id为1,mybatis生成的sql类似于:select * from users where id = ?,然后通过preparedstatement?替换为1。

${}:sql文本占位符

作用${}用于直接将传入的参数值替换到sql语句中,它不会进行预处理,因此直接将参数值插入到sql语句中。这意味着${}会将参数视为sql的一部分,可能会导致sql注入风险。

参数替换:在生成sql语句时,${}会直接将传入的值替换到sql语句中,而不会使用?占位符。

使用场景:通常用于动态生成sql片段,比如排序字段名、表名、列名等不直接来自用户输入的参数。

示例

<select id="finduserbycolumn" resulttype="user">
    select * from users where ${columnname} = #{value}
</select>
  • 如果传入的columnnameusernamevaluejohn,mybatis生成的sql类似于:select * from users where username = ?,然后通过preparedstatement?替换为john

2. 安全性和使用建议

  • sql注入防护:由于#{}会使用preparedstatement的参数绑定机制,因此可以有效防止sql注入攻击。而${}直接将参数值拼接到sql中,可能导致sql注入,因此应慎重使用。

  • 动态sql生成${}更适合用于生成动态的sql片段,比如动态表名、列名等。但要确保传入的值是可信任的,或者通过其他手段确保安全。

3. 具体示例

使用 #{} 的示例

<select id="finduserbyid" resulttype="user">
    select * from users where id = #{id}
</select>

传入id为1,生成sql为:

select * from users where id = ?

然后将参数1安全地绑定到?上。

使用 ${} 的示例

<select id="finduserbycolumn" resulttype="user">
    select * from users where ${columnname} = #{value}
</select>

传入columnnameusernamevaluejohn,生成sql为:

select * from users where username = ?

然后将参数john绑定到?上。

sql注入风险示例

<select id="finduserbycolumn" resulttype="user">
    select * from users where ${columnname} = #{value}
</select>

如果传入的columnnameusername or '1'='1',生成的sql可能是:

select * from users where username or '1'='1' = ?

这样就可能导致sql注入问题。

总结

  • #{}:安全地传递参数,防止sql注入,常用于传递用户输入的参数。

  • ${}:直接将参数值插入到sql中,适用于动态生成sql片段(如表名、列名),但存在sql注入风险,应谨慎使用。

在实际开发中,建议尽量使用#{}来传递参数,以确保sql安全性,而对于使用${}的场景,需要确保传入的参数是安全且经过验证的。

到此这篇关于mybatis中 /#{} 和 /${} 的区别小结的文章就介绍到这了,更多相关mybatis  /#{} 和 /${}内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com