mybatis中$和#的区别以及各自的使用场景

目录

[一、# 符号和 符号区别:](# 符号和 符号区别:)

[# 符号:](# 符号:)

[ 符号:](# 符号:)

二、使用场景:

[# 符号](# 符号)

[ 符号:](# 符号:)

三、XML代码示例

四、总结:

五、扩展:sql注入介绍及危害


在 MyBatis 中,$# 都是用于参数绑定的,但它们之间存在明显的差异,主要体现在参数的预处理方式和安全性上。

一、# 符号和$ 符号区别:

# 符号:

  • # 符号用于预编译 SQL 语句中的参数绑定。
  • MyBatis 会为这些参数生成 PreparedStatement 中的占位符 ?,并设置相应的参数值。
  • 这种方式是安全的,因为它可以防止 SQL 注入攻击。

$ 符号:

  • $ 符号用于直接替换 SQL 语句中的字符串。
  • MyBatis 不会为其生成 PreparedStatement 中的占位符,而是直接将其替换为相应的参数值。
  • 这种方式是不安全的,因为它可能导致 SQL 注入攻击,特别是在将字符串拼接到 SQL 语句中时

二、使用场景:

# 符号

  • 当需要绑定 SQL 语句中的参数值时,应使用 # 符号。
  • 适用于所有类型的参数,包括基本数据类型、String、集合、对象等。
  • MyBatis 会为参数生成相应的占位符,并自动进行类型转换和参数设置。

$ 符号:

  • 当需要动态构建 SQL 语句的某部分时,可以使用 $ 符号。但请注意,这可能会增加 SQL 注入的风险,因此应谨慎使用。
  • 通常用于表名、列名等动态变化的部分,而不是用于绑定参数值。

三、XML代码示例

XML 复制代码
<select id="findUserById" resultType="User">
<!--#{id} 表示一个参数占位符,MyBatis 会将其替换为实际的参数值,并生成相应的 PreparedStatement。-->
SELECT * FROM user WHERE id = #{id}

</select>
XML 复制代码
<select id="findUserByColumnName" resultType="User">
<!--${columnName} 表示一个直接替换的字符串,MyBatis 会将其替换为实际的列名。而 #{value} 则是一个参数占位符,用于绑定参数值。-->
SELECT * FROM user WHERE ${columnName} = #{value}

</select>

需要注意的是,使用 $ 符号进行动态 SQL 构建时,必须确保传入的参数值是安全的,避免 SQL 注入的风险。一种常见的做法是使用白名单机制,只允许预定义的、安全的值作为动态 SQL 的部分。

四、总结:

  • # 符号用于参数绑定,生成 PreparedStatement 中的占位符,安全且推荐使用。
  • $ 符号用于直接替换字符串,不安全且应谨慎使用,主要用于动态构建 SQL 语句的某部分。

五、扩展:sql注入介绍及危害

SQL注入是一种常见的计算机安全漏洞,它利用了对数据库执行SQL查询时未正确过滤或转义用户输入的情况。攻击者可以在输入框或参数中注入恶意的SQL代码,从而影响数据库的执行逻辑。

SQL注入的危害包括但不限于以下几点:

  1. 数据泄露:攻击者可以通过SQL注入获取未经授权的数据,包括用户信息、敏感数据甚至是整个数据库的内容。
  2. 数据篡改:攻击者可以修改数据库中的数据,包括插入虚假信息、篡改现有数据或者删除数据,导致数据的不一致性和损坏。
  3. 绕过认证:攻击者可以利用SQL注入绕过身份验证机制,以管理员权限执行操作,甚至获取系统控制权。
  4. 拒绝服务攻击:通过恶意构造的SQL查询,攻击者可以消耗数据库资源,导致数据库性能下降甚至瘫痪,从而造成拒绝服务。

为了防范SQL注入攻击,在开发时需要尽量少使用进行拼接,并没有必须使用符号的时候。

相关推荐
派大鑫wink3 分钟前
【Day12】String 类详解:不可变性、常用方法与字符串拼接优化
java·开发语言
JIngJaneIL6 分钟前
基于springboot + vue健康管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·后端
秋饼7 分钟前
【三大锁王争霸赛:Java锁、数据库锁、分布式锁谁是卷王?】
java·数据库·分布式
dyxal7 分钟前
Python包导入终极指南:子文件如何成功调用父目录模块
开发语言·python
电商API&Tina10 分钟前
【电商API接口】关于电商数据采集相关行业
java·python·oracle·django·sqlite·json·php
刘一说14 分钟前
Spring Boot中IoC(控制反转)深度解析:从实现机制到项目实战
java·spring boot·后端
悟空码字14 分钟前
SpringBoot参数配置:一场“我说了算”的奇幻之旅
java·spring boot·后端
我居然是兔子16 分钟前
Java虚拟机(JVM)内存模型与垃圾回收全解析
java·开发语言·jvm
关于不上作者榜就原神启动那件事18 分钟前
Spring Data Redis 中的 opsFor 方法详解
java·redis·spring
其美杰布-富贵-李19 分钟前
Java (Spring Boot) 反射完整学习笔记
java·spring boot·学习