MyBatis中的赋值语句:#{}和${}的区别差异(常见面试题)

news2025/2/23 20:07:17

我们开始先总结他们的差异,后面再使用代码展示差异

1.0.#{}和${}的差异

(1)${}可能存在sql注入的安全问题

(2)${}是即时sql(参数直接拼接),不能进行缓存;#{}是预编译sql(参数通过替换占位符的方式),可以缓存

(3)${}拼接字符串参数时不带引号,而#{}拼接参数会带上引号

(4)在不能自带引号的场景下,只能使用${};比如实现排序功能等

1.1.差异的原因

下面我们通过一段代码,就可以知道它们产生差异的原因了。

(1)参数是否拼接

分别使用不同符号的进行赋值

我们可以看到,当使用#{}的时候,参数位置使用的是一个占位符,而${}则是直接把参数拼接在上面了。这是它们两处不一样的地方。

(2)有无引号

下面我们将参数的类型从Integer换成String

测试结果:

发现直接使用$传参会报错,原因就是它没有自动加上双引号或者单引号;如果我们自己加上:

运行结果也就没有报错了 

由此可见,${}就是可以自己是否带引号的,这点就是让它成为有sql注入的主要原因

(3)sql注入

在上面可以知道,${}可以自主选择带引号,因此,就可以进行sql拼接,也就存在被sql注入的风险。

比如下面的sql语句:

SELECT * from userinfo where username = ' ' or 1= '1'
//参数:' or 1='1

运行结果:

很明显sql执行成了,也就是说,确实是真真实实存在sql注入的风险。(但是一般都可以通过java代码来预防注入风险)

(4)即时sql和预编译sql

sql的执行流程:sql语法检验和解析、sql优化、sql执行

因为#{}的参数使用占位符,每次只需要替换占位符就可以,因此第一、二步可以缓存下来,每次只需要执行第三步即可,效率也就更快;因此称为:预编译sql。

而${}每次都是需要拼接参数,所以不能缓存,因此称为:即时sql

1.2.${}的作用

上面说的全是${}的缺点,那它还有用武之地吗?其实没有被淘汰,也就是还有作用的,作用场景也就是参数不能有引号的情况。

(1)对某个字段排序

对数据库中的数据进行排序,相信大家不陌生吧,我们还是先复习一下排序的sql语句

默认排升序:select * from 表名  order by 列名/表达式  

排降序:select * from 表名  order by 列名/表达式 desc

如果我们需要排降序的话,就需要传参,也就是将desc作为参数,但是在sql语句中,desc是没有引号的,但是#{}对字符串传参时,会自动加上引号,进而会导致sql错误,所以只能使用${}

  • 使用#{}时

结果已经很明显了。

  • 使用${}

但是这样也会存在sql注入的安全问题,所以就需要将参数设置成枚举类型这样的可选类型。并且如果表名和字段名作为参数时也必须使用${},原因就是它们不能有引号

(2)模糊查询

模糊查询虽然不是使用${}和#{},但是也需要介绍一下原因。

复习一下模糊查询:

select * from userinfo where username like ' %min% '

%min%就是一个模糊的概念,两边是需要加上引号的。但是%min%是一个字符串,min就是我们需要的参数,不能有任何字符串。

  • #{}

报错

  • 使用${}

因为是${},所以依旧存在sql注入的风险,所以模糊查询不会使用${},而是使用内置函数

  • 使用内置函数
   @Select("select * from userinfo where username like concat('%',#{key},'%') ")
   List<UserInfo> queryUserInfoBylike(String key);


以上就是本文的全部内容。

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

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

相关文章

基于单文档的MFC图像增强

目录 function.h ColorEnhanceDib.h ColorEnhanceDib.cpp Dib.h Dib.cpp FrequencyFilterDib.h FrequencyFilterDib.cpp GrayTransformDib.h GrayTransformDib.cpp HistogramDib.h HistogramDib.cpp SharpenProcessDib.h SharpenProcessDib.cpp SmoothProcessDib.h Sm…

【Spring Boot】自动配置源码解析

目录 Spring-Boot-Starter一、准备配置类和 Bean 对象二、自动配置条件依赖三、Bean 的参数获取3.1 EnableConfigurationProperties 注解3.2 ConfigurationProperties 注解 四. Bean 的发现4.1 自己项目的 Bean 扫描4.2 jar 包的 Bean 扫描 五. Bean 的加载 自动配置总结 Sprin…

Linux系统编程——生产者消费者模型

目录 一&#xff0c;模型介绍 1.1 预备知识&#xff08;超市买东西的例子&#xff09; 1.2 模型介绍 1.3 CP模型特点 二&#xff0c;基于阻塞队列的CP模型 2.1 介绍 2.2 阻塞队列的实现 2.3 主函数实现 2.4 效果展示 三&#xff0c;POSIX信号量 3.1 信号量原理 3…

Date已不再推荐?为什么我们需要新的 Java 日期时间 API?(LocalDate、LocalDateTime、LocalTime 、Instant)

日期时间 API 是 Java 8 版本的最大功能之一。Java 从一开始就缺少一致的日期和时间方法&#xff0c;而 Java 8 日期时间 API 是对核心 Java API 的一个受欢迎的补充。 为什么我们需要新的 Java 日期时间 API&#xff1f; 在开始研究 Java 8 日期时间 API 之前&#xff0c;让我…

蛋仔派对S18赛季攻略

本人蛋仔名&#xff1a;Z周明昊帅哥&#xff08;稍微自恋了一点&#xff09;&#x1f60e; 没夺冠的心情&#xff0c;请看下图&#xff1a; 呜呜呜…… 蛋仔五小只人形&#xff1a; 观看视频 完结撒花^_^ BUY&#xff01;&#xff01;&#xff01;

31-库文件的制作与使用——静态库文件与动态库文件

31-库文件的制作与使用——静态库文件与动态库文件 一、库文件介绍 库文件是在计算机编程中用来存放变量、函数和类的文件&#xff0c;提供给开发者开箱即用的资源。库文件分为静态库和动态库两种&#xff0c;二者在程序链接阶段的行为不同&#xff1a; 静态库&#xff1a;在…

HALCON如何添加外部函数

1、在HALCON菜单栏中点击【编辑】选择【参数选择】或者 点击【函数】选择【管理函数】进入到参数窗口&#xff1b; 2、在参数窗口下依次选择【函数】、【目录】和【添加】操作&#xff1b; 3、外部函数添加成功后&#xff0c;其他程序文件均可使用该外部函数。

自定义prometheus监控获取nginx_upstream指标

1、前言 上篇文章介绍了nginx通过nginx_upstream_check_module模块实现后端健康检查&#xff0c;这篇介绍一下如何自定义prometheus监控获取nginx的upstream指标来实时监控nginx。 2、nginx_upstream_status状态 支持以下三种方式查看nginx_upstream的状态 /status?formatht…

【C++】标准库:介绍string类

string 一.string类介绍二.string类的静态成员变量三.string类的常用接口1.构造函数&#xff08;constructor&#xff09;2.析构函数&#xff08;destructor&#xff09;3.运算符重载&#xff08;operator&#xff09;1.operator2.operator[]3.operator4.operator 4.string的四…

Kitti数据集解析

目录 一、概述 2、详细内容 1、lable标签 2、标定参数 3、点云数据 C++代码读取bin文件 python代码读取bin文件 三、功能实现 1、点云数据转成投影到图像 2、图像数据转成投影到点云 3、点云3D结果转成图像BEV鸟瞰图结果 一、概述 KITTI整个数据集是在德国卡尔斯鲁厄…

DDoS攻击:威胁与防护策略

DDoS&#xff08;分布式拒绝服务&#xff09;攻击是网络安全领域的一大挑战&#xff0c;对企业造成严重的影响。本文将深入探讨DDoS攻击的原理和防护方法。 DDoS攻击的原理 DDoS攻击通过大量请求&#xff0c;使目标系统无法响应正常请求。攻击者利用多台计算机发送大量请求&am…

【Unity2D 2022:Data】读取csv格式文件的数据

一、创建csv文件 1. 打开Excel&#xff0c;创建xlsx格式文件 2. 编辑卡牌数据&#xff1a;这里共写了两类卡牌&#xff0c;第一类是灵物卡&#xff0c;具有编号、卡名、生命、攻击四个属性&#xff1b;第二类是法术卡&#xff0c;具有编号、卡名、效果三个属性。每类卡的第一…

使用在UE5中使用AirSim插件Eigen库头文件引用报错,出现报错的解决方式

一、概述 如图所示&#xff0c;用红线圈出的两条头文件引用会报错&#xff0c;提示无法找到他们&#xff0c;但是可以发现的是&#xff0c;他们的路径书写是没有问题的。 // #include <Source/Airlib/deps/eigen3/Eigen/Core> // #include <Source/Airlib/deps/eigen…

追问试面试系列:开篇

我们不管做任何事情&#xff0c;都是需要个理由&#xff0c;而不是盲目去做。 为什么写这个专栏&#xff1f; 就像我们被面试八股文时&#xff0c;市面上有很多面试八股文&#xff0c;随便一个八股文都是500&#xff0c;甚至1000面试题。诸多面试题&#xff0c;难道我们需要一…

【系统架构设计师】十八、信息系统架构设计理论与实践①

目录 一、信息系统架构概述 二、信息系统架构风格与分类 2.1 信息系统架构风格 2.2 信息系统架构分类 三、信息系统架构模型 3.1 单体应用 3.2 客户机/服务器 3.2.1 二层 C/S 3.2.2 三层 C/S 和 B/S 3.2.3 多层 C/S 和 B/S 3.2.4 MVC 3.3 面向服务架构(SOA)模式 …

PVE环境中调整虚拟机磁盘大小

我的希望将PVE中的虚拟机磁盘调整一下&#xff0c;增加20GB。在查询了一些资料后&#xff0c;做一下总结教程。 环境是 PVE8.2.2 版本&#xff0c;虚拟机系统是centos7.9.2009-minimal&#xff0c; 安装系统时划分磁盘分区方式是默认分区方式&#xff08;不同分区方式下&#…

RISC-V (二)汇编语言编程

简介 汇编语言是一种“低级”语言。 汇编语言的缺点&#xff1a; -难度 -难写 -难移植 汇编语言的优点&#xff1a; -灵活 -强大 汇编语言的应用场景 -需要直接访问底层硬件的地方 -需要对性能执行极致优化的地方 汇编语言语法介绍&#xff08;GNU版本&#xff09; 基本组成 …

《python程序语言设计》第6章15题财务应用程序:打印税款表。利用程序清单4-7的代码

6.15 打印税款表 def computeTax(status_n, income):tax 0if status_n 0:if income < 8350:tax income * 0.10elif income < 33950:tax 8350 * 0.10 (income - 8350) * 0.15elif income < 82250:tax 8350 * 0.10 (33950 - 8350) * 0.15 (income - 33950) * 0.…

Docker 制作java8镜像

一、在Linux服务器安装Docker 可参考&#xff1a;Linux安装Docker-CSDN博客 二、使用Dokcer制作java8镜像 2.1 上传jdk8的压缩包 mkdir -p /home/data/develop/jdk cd /home/data/develop/jdk 在该路径下上传jdk-8u261-linux-x64.tar.gz包 如下图&#xff1a; 2.2 编写Docke…

HALCON如何创建本地函数

HALCON中有本地函数(.hdev)、外部函数(HDevelop函数文件.hdvp)和库函数(.hdpl) 本地函数(.hdev)&#xff1a;创建后仅在当前程序文件中使用&#xff1b; 外部函数(HDevelop函数文件.hdvp)&#xff1a;创建后可以在其他程序文件中复用&#xff0c;默认保存在…/ procedures/下…