答案:#{}通过预编译防止SQL注入,安全且性能好,应优先使用;${}为字符串替换,存在注入风险,仅用于动态表名列名等必要场景。

#{}${}#{}${}在 MyBatis 中,
#{}PreparedStatement
举个例子,如果你写:
SELECT * FROM users WHERE id = #{userId}当
userId
123
SELECT * FROM users WHERE id = ?
123
?
userId
1 OR 1=1
而
${}例如,如果你写:
SELECT * FROM users ORDER BY ${columnName}当
columnName
user_name
SELECT * FROM users ORDER BY user_name
columnName
user_name; DROP TABLE users;
SELECT * FROM users ORDER BY user_name; DROP TABLE users;
因此,我的个人建议是,除非你非常清楚自己在做什么,并且已经采取了严格的输入验证和白名单机制,否则,在任何需要传递用户输入数据的地方,都应该优先使用
#{}${}ORDER BY
在我看来,SQL 注入是后端开发中最常见的,也是最危险的安全漏洞之一。它就像是数据库的大门,如果你不加防范,攻击者就能通过这个漏洞,像开锁一样,随意进出你的数据宝库,轻则数据泄露,重则数据被篡改甚至删除。选择
#{}#{}#{}OR 1=1
想象一下,你有一个登录接口,用户输入用户名和密码。如果你的 SQL 是这样写的:
SELECT * FROM users WHERE username = '${username}' AND password = '${password}'一个恶意用户在用户名输入框里填入
' OR '1'='1
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '随便填'
因为
OR '1'='1'
但如果使用
#{}SELECT * FROM users WHERE username = #{username} AND password = #{password}即使恶意用户输入同样的内容,数据库也会将其视为字面量字符串,比如
username = '' OR '1'='1'
#{}编程世界里哪有绝对的非黑即白呢?虽然
#{}${}最典型的例子就是动态的表名、列名,以及
ORDER BY
log_2023
log_2024
假设你需要根据用户选择的列进行排序:
<!-- 错误且危险的写法,但演示了需求 -->
SELECT * FROM products ORDER BY ${sortByColumn} ${sortOrder}这里
sortByColumn
price
name
sortOrder
ASC
DESC
#{}#{}columnName
columnName
ORDER BY 'price'
所以,在这种情况下,使用
${}${}sortByColumn
sortOrder
sortByColumn
id
name
price
sortOrder
ASC
DESC
${}这其实是个两难,你为了实现动态性而牺牲了安全性,所以在使用
${}除了最显著的安全差异,
#{}${}从性能上看,
#{}PreparedStatement
${}再聊聊可维护性。使用
#{}反观
${}${}#{}${}所以,在选择使用哪种方式时,我们不仅要考虑眼前的功能实现,更要着眼于项目的长期健康发展,包括安全性、性能和未来的维护成本。在我看来,
#{}${}以上就是#{} 和 ${} 在 MyBatis 中有什么区别?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号