mybatis中#{}和${}的区别
动态sql是mybatis的主要特性之一,我们的惯用做法是将mapper中收集来的参数传递到xml中,组装成动态的sql语句
去执行,mybatis支持两种参数替换的语法:${}和#{},下面简单介绍下两者的区别
1、在解析时:
${}是一个简单的String替换
#{}会解析为一个prepared statement,对的,学习过原生jdbc的同学一定再熟悉不过这个叫法了:预处理语句
也就是类似select * from user where name = ?; 预处理的好处?写过视图的应该知道,视图就好比一条预处理的sql
执行的时候效率当然更高一些
2、防sql注入
${}既然是String原原本本的替换,那么如果我找漏洞,可否将传入的值后面加一个类似于可执行的sql语句?
比如传入id值,我可以这样传入:"id=1;delete from user",最后拼接起来的语句变为
"select * from user where id=1;delete from user"
user表被删了,当然这是个简单的例子,仅仅用来说明问题
#{}则不会出现这样的问题
因此在传入的值中包含表名的时候,必须使用#{},其实在项目中${}早已被丢弃、、、
分类:
1-SpringBoot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY