MyBatis中的#{}和${}有什么区别?

news2024/11/24 13:52:15

首先#{} 和 ${} 都是参数占位符,其中#{}是预编译处理,${}是字符直接进行替换。预编译处理是指:MyBatis 在处理#{}时,会将 SQL 中的 #{} 替换为?号,使⽤ PreparedStatement 的 set ⽅法来赋值。直接替换是指MyBatis 在处理 ${} 时,就是把 ${} 替换成变量的值。

其中#{}与JDBC中的PreparedStatement的作用类似,都可以防止sql注入问题。

但是在单表查询中,他们都可能会带来越权查询和操作数据等问题。下面详细列出实例:

使用#{}得到JDBC的代码如下:【针对int类型的参数】

使用${}得到JDBC的代码如下:【针对int类型的参数】 

 使用${}得到JDBC的代码如下:【针对String类型的参数】

不难看出这个时候sql语法报错了。

使用#{}得到JDBC的代码如下:【针对String类型的参数】

到这里我们就已经可以看出来一些区别了:

1.定义不同: #{}是预处理;而${}是直接替换。

2.使用不同: #{}适用于所有类型的参数匹配;但${}只适用数值类型。

3.安全性不同: #{}性能高,因为他使用占位符已经预编译了,并且没有安全问题; 但${}存在SQL注入的安全问题(下面会给出示例)。

那再谈谈#{}和${}的各自使用场景:

1.${}的使用场景:(对数据进行排序的时候)

但是如果此时使用#{}就会报sql语法错误,因为此时需要传递的是SQL关键字。 

到这里咱们又可以对#{}和${}做一个小结:

当传递的是一个SQI.关键字(SQI命令)的时候,只能使用${},此时如果使用#{}就会认为传递的为一个普通的值,而非SQL命令,他在替换的时候会自动加上’’号,所以执行就会报错。

接下来咱们继续说说刚才在上面总结的那样,${}存在SQL注入的安全问题。

咱们在实现用户登录功能这个场景下,通常需要获取用户名和密码来校验是否正确,那么这个时候就会出现问题,我们先来正常的查询:

再继续看SQL注入的有安全问题: 

 

在sql语法中,1=’1’是正确的,所以这条sql语句也是可以执行的。所以当不得不使用$时,那么一定要在业务代码中,对传递的值进行安全效验。 

最后再看看like查询这种场景。

使用#{}:

但是使用${}就可以了: 

但是使用${}还是有安全风险,因为模拟查询的时候,不知道用户传来的是什么数据,我们也不能一一穷举出来去规避,那么此时使用#{}的时候还有一种方法可以避免安全问题:

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/555425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【谷粒商城笔记】2. 创建项目与运行

1. 创建微服务项目 共分为下面五个 商品服务product 存储服务ware 订单服务order 优惠券服务coupon 用户服务member 1.1 新建github/gitee项目 首先去github新建项目 在IDEA中导入项目 从版本控制(Version Control)新建Project 选择路径和git链接 1.2 创建微服务 新建…

modscan模拟数据,nodred通过modbus协议向emqx创建规则引擎写入TDengine库

nodred通过modbus协议向emqx创建规则引擎写入TDengine库过程 一、emqx存储数据到TDEngine数据库1.1 进入emqx界面1.2 新建资源1.3 新建规则引擎1.4 测试 二、modscan模拟设备数据三、在Node-RED上模拟Modbus通讯3.1 nodeRed环境搭建3.2 nodeRed使用3.3 nodered读取modbus发送的…

Firewalld

目录 firewalld概述 firewalld 与 iptables 的区别 firewalld 区域的概念 firewalld防火墙预定义了9个区域 firewalld数据处理流程 firewalld检查数据包的源地址的规则 firewalld防火墙的配置方法 常用的firewall-cmd 命令选项 区域管理 服务管理 ​编辑端口管理 设…

创建项目执行计划的5个简单步骤

项目执行计划是定义项目将如何执行的文件。执行计划解释项目中涉及的战略目标和步骤,定义项目完成时间表,并列出成功项目所需的资源(包括团队成员)。 使用项目计划是多种项目管理最佳实践之一。这个过程并不像看起来那么复杂。按…

读财报丨产品收入增长近70%,百济神州已成功切换成长驱动模式?

5月12日,百济神州(北京)生物科技有限公司(下称“百济神州”)公布2023年第一季度业绩报告。从数据来看,延续了2022年的良好增长态势,实现营业收入30.66亿元,同比增长57%,而…

unity实现小球poke不穿膜

引言 在oculus quest2官方实现了手部指尖poke按键不穿膜,具体采用代码的方式进行限制,具体看oculus quest包中的HandPokeLimiterVisual.cs,下面则实现其他物体(小球)作为pokeInteractor来poke按键,当按下的…

Linux网络——shell编程之SNAT与DNAT的应用

Linux网络——shell编程之SNAT与DNAT的应用 一、SNAT的介绍1.SNAT概述2.SNAT源地址转换过程 二、SNAT转换三、DNAT的介绍1.DNAT概述2.DNAT转换前提条件 四、DNAT的转换五、防火墙规则的备份和还原六、tcpdump抓包工具的运用 一、SNAT的介绍 SNAT(SNAT)一…

蓝桥杯数论总结:最大公约数和最小公倍数(原理+性质证明+python板子)

目录 最大公约数 手写GCD 最小公倍数 推导LCM函数表达式 GCD基本性质 性质的证明 取模运算基本性质 证明 最大公约数 gcd是最大公约数的意思。Python的math库里有gcd函数。 在Python命令行运行gcd,可发现其可传入0、不会返回负数、可对多个数进行判断的性质…

利用 DynamoDB 和 S3 结合 gzip 压缩,最大化存储玩家数据

前言 一些传统游戏架构中,采用 MySQL 存储玩家存档数据,利用分库分表分散单库单表的存储和性能压力,从而达到支持更多玩家的目的。随着数据量增长,数据表中 varchar 类型已经无法满足游戏中单字段的存储需求,而 blob …

数据结构 -最短路径dijkstra(迪杰斯特拉)算法讲解及代码实现

迪杰斯特拉算法是一种广义的贪心算法,求出局部最优解,再去求全局最优解 图文讲解: 举例图:(起始点为1) 辅助数组: s:记录了目标顶点到其他顶点的最短路径是否求得(求得…

代码调试技巧

目录 1.为什么要进行调试? 2.调试的基本步骤 3.关于Debug版本和Release版本 4.调试技巧 5.调试总结 我还是喜欢真实的世界,因为在那里,我可以通过自己的努力来改变残酷的现实 本专栏适用于有一定C语言基础并且还要继续学习的人 往期…

CryoEM - 冷冻电镜 CryoSPARC 软件的安装与环境配置

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130809095 CryoSPARC 软件是一种用于冷冻电镜数据处理的创新工具,可以快速、准确地重建生物分子的三维结构。CryoSPARC 软件…

【使用ChatGPT制作PPT】

内容目录 一、利用ChatGPT生成PPT内容1. 打开ChatGPT:2. 输入需求:3. 复制: 二、制作生成PPT1. 打开PPT制作网站:2. 左侧网页版-导入创建-粘贴Markdown内容-导入创建3. 自行更改副标题、演讲者、选择模板、演示及下载 一、利用Cha…

Linux网络——shell编程之iptables防火墙

Linux网络——shell编程之iptables防火墙 一、概述1.iptables2.netfilter 和 iptables的关系 二、iptables中的四表五链1.四表五链的关系2.四表3.五链 三、匹配顺序1.数据包到达防火墙的匹配流程2.规则链之间的匹配顺序3.规则链内的匹配顺序 四、iptables 防火墙的配置方法1.ip…

python tesseract-ocr + jTessBoxEditorFX 训练自定义字库

在使用tesseract-ocr进行字符识别时,我们使用了官方提供的字库,例如英文字库、中文字库,但这些字库并不一定能满足我们所有的需求。所以有些时候,我们就需要训练属于自己的自定义字库。废话少说,直接开干。 第一步&am…

联想首次展示全栈算力方案服务,品牌换新亮相

1、联想算力,第一次真正被所有人感知。 2、基于软硬服一体化的优势,联想打造了丰富多样的四维算力服务,即融合化、场景化、订阅化、绿色化,可以满足不同企业、不同行业的定制化需求。 5月20日,主题为“联想方案服务&am…

2023中兴软件类笔试

1.下列Python代码:将近似输出什么? import numpy as np print np.sqrt(6*np.sum(1/np.arange(1,1000000, dtypenp.float)**2))这段代码是用来计算圆周率的巴塞尔问题(Basel problem)的近似值,输出结果将近似为3.14159…

使用SMTP协议发送邮件

剧情介绍 今天心血来潮,学了一下Python3,里面有个章节是发送邮件,用示例里面的代码,运行后报错,然后记录一下问题是如何解决的,大家可以看一下,可以有效避坑。 SMTP协议介绍 SMTP&#xff08…

Mysql数据库备份 一天一次 保存最新五天 每天凌晨三点备份

Mysql数据库备份 一天一次 保存最新五天 每天凌晨一点三十备份 步骤一 先查看 sudo systemctl status crond 是否存在 不存在执行下面代码 sudo yum install cronie sudo systemctl start crond sudo systemctl enable crond sudo systemctl status crond 步骤二 Cd /home …

从零开始 Spring Boot 33:Null-safety

从零开始 Spring Boot 33:Null-safety 图源:简书 (jianshu.com) Null-safety(null安全)实际上是Java这个“古老”语言的历史包袱,很多新的语言(比如go或kotlin)在诞生起就在语言层面提供对null…