Mybatis 中#和$的区别是什么? - 面试宝典

举报
皮牙子抓饭 发表于 2023/08/22 09:57:39 2023/08/22
【摘要】 在MyBatis中,​​#​​和​​$​​是两种不同的参数占位符。 ​​#​​是预编译的占位符,它可以防止SQL注入攻击。当使用​​#​​时,MyBatis会将参数值以安全的方式替换到SQL语句中,使用的是PreparedStatement的预编译机制。例如,如果我们使用​​#{name}​​作为参数占位符,那么MyBatis会将该占位符替换为​​?​​,并将参数值以安全的方式传递给Prep...

在MyBatis中,​#​​$​是两种不同的参数占位符。 ​#​是预编译的占位符,它可以防止SQL注入攻击。当使用​#​时,MyBatis会将参数值以安全的方式替换到SQL语句中,使用的是PreparedStatement的预编译机制。例如,如果我们使用​#{name}​作为参数占位符,那么MyBatis会将该占位符替换为​?​,并将参数值以安全的方式传递给PreparedStatement。 ​$​是字符串替换的占位符,它直接将参数的字符串值替换到SQL语句中。当使用​$​时,需要注意SQL注入攻击的风险。因为参数值是直接替换到SQL语句中的,如果参数值中包含恶意的SQL代码,可能会导致安全问题。因此,使用​$​时需要进行参数验证和过滤。 综上所述,​#​是安全的占位符,适合用于大部分情况下,并且推荐在编写MyBatis SQL语句时使用​#​进行参数的占位;而​$​是字符串替换的占位符,适合用于一些特殊的需求,但需要注意防止SQL注入攻击。

下面是一个使用​​#​​​和​​$​​的示例代码: 假设有一个User表,包含id、name和age字段。 使用​​#​​的示例代码:

javaCopy code@Select("SELECT * FROM User WHERE name = #{name} AND age > #{age}")
List<User> getUsersByNameAndAge(@Param("name") String name, @Param("age") int age);

上述代码中,​​#{name}​​和​​#{age}​​都使用了​​#​​作为占位符。MyBatis会将参数值以安全的方式替换到SQL语句中。 使用​​$​​的示例代码:

javaCopy code@Select("SELECT * FROM User WHERE name = '${name}' AND age > ${age}")
List<User> getUsersByNameAndAge(@Param("name") String name, @Param("age") int age);

上述代码中,​​${name}​​和​​${age}​​都使用了​​$​​作为占位符。注意,这里没有使用​​#{}​​进行占位符的标识,而是直接使用了​​${}​​。使用​​$​​时,参数值会直接替换到SQL语句中,需要注意防止SQL注入攻击的风险。 需要注意的是,使用​​#​​和​​$​​的方式会影响SQL的执行方式和安全性,根据具体情况选择合适的方式。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。