被拷打已老实!面试官问我 #{} 和 ${} 的区别是什么?

csdn推荐

引言:在使用 MyBatis 进行数据库操作时,#{} 和 ${} 的区别是面试中常见的问题,对理解如何在 MyBatis 中安全有效地处理 SQL 语句至关重要。正确使用这两种占位符不仅影响应用的安全性,还涉及到性能优化。

题目

被拷打已老实!面试官问我 #{} 和 ${} 的区别是什么?

推荐解析 预编译与直接替换

面试官问了我这个问题,直接把我问老实了,求放过,赶忙来写下以下思考:

1)#{}:使用 #{} 时,MyBatis 为 SQL 语句的参数生成一个预编译语句,并通过参数占位符(?)来代替实际的参数值。这种方式是安全的,因为它防止了 SQL 注入攻击,参数值在发送到数据库之前不会被解析为 SQL 的一部分。

如果你有一个查询用户的操作,你可以这样写:

SELECT * FROM users WHERE id = #{userId}

2)${}:相反,使用 ${} 时,参数值被直接替换到 SQL 语句中。这种方式虽然灵活,可以动态替换表名、列名等 SQL 语句的组成部分,但却可能导致 SQL 注入问题,因为参数值如果包含恶意的 SQL 代码也会被执行。

如果你需要动态地选择表名或列名,可以这样使用:

SELECT * FROM ${tableName}

性能考虑

对于性能我得出以下思考:

1)#{} 性能优势:由于使用预编译的 SQL 语句,数据库可以重用相同结构的 SQL 语句,减少编译次数,提高执行效率。

2)${} 性能问题:可能导致每次都要编译新的 SQL 语句,因为 SQL 结构可能因为参数的不同而改变。

类型处理

琢磨琢磨我又发现了新大陆!类型处理~

1)#{} 类型处理:MyBatis 可以根据参数的 Java 类型自动推断数据库类型,处理日期、枚举等复杂类型的转换。

2)${} 类型处理:不进行类型转换,将参数视为纯文本,直接嵌入到 SQL 语句中。

鱼聪明 AI 的回答:

鱼聪明 AI 地址:

#{}(参数占位符)

${}(SQL 字符串拼接)

文章来源:https://blog.csdn.net/2401_84419325/article/details/139804532



微信扫描下方的二维码阅读本文

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容