MyBatis中 #{} 和 ${} 区别
发布网友
发布时间:2024-09-05 22:35
我来回答
共1个回答
热心网友
时间:2024-10-03 03:37
在Mybatis的Mapper映射文件中,#{} 和 ${} 用于引用参数的方式有着显著的区别。#{}在解析为SQL时,会自动对参数值添加引号,防止SQL注入,而${}则直接将参数值拼接到SQL中,存在潜在的SQL注入风险。
举个例子,当使用#{},如username="Amy"时,SQL会被解析为安全的:
而使用${},若username被恶意设置为"' OR 1=1 OR '",可能导致整个数据库内容暴露,不安全。
尽管两者都可以使用,但在存在SQL注入风险的情况下,强烈推荐使用#{}。例如,在模糊查询中,如username = "Amy",#{}的写法为:
而${}写法可能导致SQL意图被非法参数更改,不推荐。
然而,${}在某些场景下是必需的,如需要直接表示字段名或表名,如期望查询sex字段,使用#{}会导致错误的SQL结构:
在这种情况下,使用${}可以得到正确的结果:
尽管存在这些差异,但整体上,#{}在防止SQL注入方面提供了更好的保护。若需了解更多实用技巧,欢迎关注我的公众号(具体名称见个人简介),一起探索技术的世界。