返回顶部
分享到

MyBatis中$与#的区别解析介绍

java 来源:互联网 作者:佚名 发布时间:2025-07-13 07:28:55 人浏览
摘要

一、介绍 #(井号):MyBatis使用#{}作为参数占位符时,会创建预处理语句(Prepared Statement),并将参数值作为预处理语句的参数绑定到SQL语句中。 使用#可以防止SQL注入攻击,因为MyBatis会自动

一、介绍

#(井号):MyBatis使用#{}作为参数占位符时,会创建预处理语句(Prepared Statement),并将参数值作为预处理语句的参数绑定到SQL语句中。

使用#可以防止SQL注入攻击,因为MyBatis会自动对参数值进行转义处理。

#{}内部可以是参数的名称或者参数的索引位置(例如#{param1}或者#{1})。

1

SELECT * FROM users WHERE username = #{username}

$(美元符号):MyBatis使用${}作为参数占位符时,不会创建预处理语句。而是直接将参数值拼接到SQL语句中。

使用$不会对参数值进行转义,因此容易受到SQL注入攻击,除非参数值是可信的或者已经进行了适当的处理。

${}内部通常是参数的名称。

1

SELECT * FROM ${tableName} WHERE id = #{id}

$和#的主要区别:

a、安全性:#提供预处理语句的参数绑定,更安全,可以有效防止SQL注入;$直接将参数值拼接到SQL语句中,存在SQL注入的风险。

b、性能:#通常性能更好,因为预处理语句可以重复使用,而$每次都会生成新的SQL语句。

c、使用场景:#适用于大多数情况,特别是当参数是用户输入时;$适用于需要动态指定表名或列名的情况,因为这些部分不能作为预处理语句的参数。

因此,除非有特殊需求,通常推荐使用#来提高SQL语句的安全性和性能。

二、sql注入风险实例

1、存在 SQL 注入风险的情况(使用 $):

1

2

3

4

5

6

7

8

// Mapper 接口

public interface UserMapper {

    User selectUserByUsername(String username);

}

// XML 映射文件(存在注入风险)

<select id="selectUserByUsername" resultType="User">

    SELECT * FROM users WHERE username = '${username}'

</select>

攻击示例:当输入的 username 为 ' OR '1'='1 时,最终生成的 SQL 语句如下:

1

SELECT * FROM users WHERE username = '' OR '1'='1'

这个 SQL 语句会让所有用户记录都被返回。

2、安全处理方式(使用#)

1

2

3

4

5

6

7

8

// Mapper 接口

public interface UserMapper {

    User selectUserByUsername(String username);

}

// XML 映射文件(安全)

<select id="selectUserByUsername" resultType="User">

    SELECT * FROM users WHERE username = #{username}

</select>

3、预编译过程

编译后的 SQL:SELECT * FROM users WHERE username = ?
实际执行时:如果输入的 username 是 ' OR '1'='1,JDBC 会对其进行转义,转义后的值为 \' OR \'1\'=\'1。
最终效果:查询会去匹配一个名为 ' OR '1'='1 的用户,显然这样的用户是不存在的,注入攻击也就失败了。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • MyBatis中$与#的区别解析介绍
    一、介绍 #(井号):MyBatis使用#{}作为参数占位符时,会创建预处理语句(Prepared Statement),并将参数值作为预处理语句的参数绑定到SQL语
  • 在宝塔面板中安装OpenJDK-17的3种方法
    tags: [Minecraft, 服务器搭建, 宝塔面板, Java] 如果你的宝塔面板软件商店中缺少OpenJDK-17(例如搭建 Minecraft 1.17+ 服务器时),本文提供三种解决
  • Java基于iText库实现PDF模板动态赋值与文档生成功
    在企业级开发中,生成标准化的 PDF 文档(如合同、报表、发票等)是常见需求。与 Word 文档不同,PDF 以其固定布局和跨平台显示一致性的
  • Java对异常的认识与异常的处理介绍
    一、认识异常与异常类型。 (1)简单定义-什么是异常? Java程序在运行时可能出现的错误或非正常情况。 (2)常见比喻 程序运行的安全气
  • Before和BeforeClass的区别及介绍
    Before和BeforeClass的区别 @Before和@BeforeClass都是JUnit测试框架中的注解,它们在测试执行过程中的作用不同: @Before:这个注解应用于一个方法上
  • 一文彻底搞懂Java中的SPI是什么
    在大厂 Java 面试中,SPI(Service Provider Interface)常被用来考察候选人对模块解耦、框架设计和类加载机制的理解。很多候选人只知其名不知其
  • Maven特殊pom.xml配置文件-BOM解读

    Maven特殊pom.xml配置文件-BOM解读
    特殊pom.xml配置文件 - BOM 仅用于集中管理项目依赖版本 在 Maven 中,BOM 用于定义一个项目的依赖版本的集合,通常用于管理一组共享的依赖版
  • Java 集合 Collection介绍及常用方式

    Java 集合 Collection介绍及常用方式
    单列集合体系结构 注意: List系列集合添加的元素是有序(存取数据的顺序相同),可重复,有索引的 Set系列集合 添加的元素是无序,不能
  • Spring Boot 常用注解详解与使用最佳实践建议
    一、核心启动注解 1. @SpringBootApplication 作用:Spring Boot应用的入口注解,组合了@Configuration、@EnableAutoConfiguration和@ComponentScan 使用场景:主启
  • Spring Boot Controller处理HTTP请求体的方法
    Spring Boot (通过Spring MVC) 提供了强大的机制来处理不同 Content-Type? 的HTTP请求体。这主要依赖于 HttpMessageConverter? 接口的各种实现,它们能够自
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计