简述MyBatis中#{}引用和${}引用的区别

各位大佬光临寒舍,希望各位能赏脸给个三连,谢谢各位大佬了!!!  

目录

1.有无预编译

优点

缺点

2.SQL执行的快慢

3.能否被SQL注入

4.参数输入方式

5.总结


1.有无预编译

#{}是有预编译的而${}是没有预编译的,那什么是预编译,预编译又有什么优缺点呢?在了解这个之前,预编译进行的步骤:

它会将SQL语法进行解析再进行SQL优化再进行编译,最后才给到数据库进行执行。

优点

但是当有多个SQL语句的时候,预编译就会显得很慢,所以预编译的SQL会被加入到一个缓存区,当只有?处的参数变化时,会直接从缓存区中拿到SQL,让SQL进行执行,这样它的速度就会加快很多。并且执行了SQL优化后,SQL语句就不会因为SQL注入导致数据库被破坏。

缺点

在执行多个不仅仅是参数不同的SQL时每次都需要重新预编译,导致速度不如不预编译的快。

2.SQL执行的快慢

就像上面说的有无预编译的区别,#{}在执行多个仅在参数有所不同的SQL时仅仅在预编译时进行编译省去了SQL的编译,执行效率就更高,而${}则只是一个字符串拼接,每次都要把SQL语句给到数据库进行编译处理再执行,对于多个仅在参数有所不同的SQL时效率低,而在不仅仅是参数不同的SQL语句中${}更加有效率。但是当今的项目大部分都是执行多个仅在参数有所不同的SQL,所以大部分情况都是#{}更有效率。

3.能否被SQL注入

因为#{}在预编译阶段就进行了SQL的优化,导致它不仅仅是SQL的拼接,而是替换?处的参数,所以它不能被SQL注入从而使数据库受到损害。而${}只是对数据的单纯拼接,所以它是会被SQL注入的,就比如以下语句:

@Select("select * from student1 where id<=${id}")public List<StudentInfo> getId(Integer id) ;

我们可以直接输入以下内容来获取所有的用户信息

1 or 1=1

也可以输入以下内容直接删除数据库

1;drop database mybatis;

 所以${}是比较危险的。

4.参数输入方式

#{}会根据所对应的参数选择加不加“”,如String类型就会加“”,而Integer类型就不会加引号。而${}在所有情况下都不会加引号。如图:

#{}会进行参数带入

${}直接以字符形势加入字符,这时候就会报错,外面需要自己在参数外加‘’

所以在一般情况下#{}方便很多,我们不需要在参数为String时外面添加引号,但是也有特殊情况,那就是我们需要String类型但是我们不想加引号,如自己选定降序,升序排序。但是我们又怕SQL注入,所以一般对于这种情况我们都会对前端或者后端做出交互限制,让前端发送数字,或者后端把前端的字符转成数字,再以键值对的形式输入参数,这样就算有别的数据也会被判定为不合法。

5.总结

总的来说,#{}的用途更加广泛,也更加安全,它们俩的区别概括一下也就三个点:

1.#{}有预编译${}无预编译

2.#{}写入参数是占位的方式不会被SQL注入,安全,${}是直接以字符的形式写入参数,会被SQL注入,不安全。

3.一般情况的SQL#{}都能完成,但是对于一些特殊场景比如排序,字段名作为参数等情况需要使用${},但是也要注意使用方法。

这里其实还有一个就是模糊查询,正常情况下需要用${},因为例如say like '%hi%',这样的查询我们只能用'%${hi}%',这样的形式来注入参数,而刚好MySQL有个concat拼接字符串的函数,所以我们可以直接使用concat来完成如 say like concat('%',#{hi},'%')。那我们今天就讲到这吧。有到时候和各位说再见了。在这之前:

制作不易,望各位大佬赏个脸,给个三连吧!!谢谢各位大佬了!!!

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

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

相关文章

LiveGBS流媒体平台GB/T28181用户手册-服务器概览:通道信息、负载信息、CPU使用、存储使用、带宽使用(Mbps)、内存使用

LiveGBS用户手册-服务器概览&#xff1a;通道信息、负载信息、CPU使用、存储使用、带宽使用&#xff08;Mbps&#xff09;、内存使用 1、服务器概览1.1、通道信息1.2、负载信息1.2.1、信息说明1.2.2、会话列表 1.3、CPU使用1.4、存储使用1.5、带宽使用&#xff08;Mbps&#xf…

15:00面试,15:08出来,面试问的有点变态。。。。

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天…

阿里云数据库 SelectDB 版全面商业化,开启现代化实时数据仓库的全新篇章

2024 年 5 月 21 日&#xff0c;由阿里云联合飞轮科技共同举办的「阿里云数据库 SelectDB 版商业化产品发布会」于线上召开。阿里巴巴集团副总裁、阿里云数据库产品事业部负责人李飞飞宣布&#xff0c;阿里云数据库 SelectDB 版在中国站及国际站全面发布&#xff0c;正式开启商…

ROS | 用C++和python实现运动控制功能

基础知识&#xff1a; 用C实现&#xff1a; C代码&#xff1a; 用python实现&#xff1a; Python代码&#xff1a;

数据库理论基本概念

数据库理论基本概念 三级模式和两级映像 外模式 > 用户和数据库系统的接口 -------- 外模式-概念模式映射 概念模式 > 数据的逻辑结构和特征的描述 -------- 概念模式-内模式映射 内模式 > 数据物理结构和存储方式的描述三级…

避雷:搭建ai知识库的6大注意事项

随着人工智能技术的发展&#xff0c;ai知识库成为众多企业追求的一个重要部分&#xff0c;帮助企业提高运营次效率&#xff0c;越来越受到人们的关注。但是&#xff0c;在搭建ai知识库的过程中&#xff0c;稍不留意&#xff0c;就会漏掉一些小细节&#xff0c;导致做出来的ai知…

GPT-4o 引领人机交互新风向的向量数据库Milvus Cloud 成本

成本 AIGC 时代对于冷热储存的呼唤 成本一直是向量数据库获得更广泛使用的最大阻碍之一,这个成本来自两点: 储存,绝大多数向量数据库为了保证低延迟,需要把数据全量缓存到内存或者本地磁盘。在这个动辄百亿量级的AI 时代,意味着几十上百 TB 的资源消耗。 计算,数据需…

OpenFeign高级用法:缓存、QueryMap、MatrixVariable、CollectionFormat优雅地远程调用

码到三十五 &#xff1a; 个人主页 微服务架构中&#xff0c;服务之间的通信变得尤为关键。OpenFeign&#xff0c;一个声明式的Web服务客户端&#xff0c;使得REST API的调用变得更加简单和优雅。OpenFeign集成了Ribbon和Hystrix&#xff0c;具有负载均衡和容错的能力&#xff…

线性回归模型之套索回归

概述 本案例是基于之前的岭回归的案例的。之前案例的完整代码如下&#xff1a; import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import Ridge, LinearRegression from sklearn.datasets import make_regression from sklearn.model_selectio…

NegativePrompt:利用心理学通过负面情绪刺激增强大型语言模型

【摘要】大型语言模型 (LLM) 已成为各种应用不可或缺的一部分&#xff0c;从传统的计算任务到高级人工智能 (AI) 应用。这种广泛的应用促使社会科学等各个学科对 LLM 进行了广泛的研究。值得注意的是&#xff0c;研究表明 LLM 具有情商&#xff0c;可以通过积极的情绪刺激进一步…

C++:深入理解多态

一、多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 那究竟多态的实际价值体现在哪里呢&#xff1f;&#xff1f; 1、举个例子比如说购买高铁票这个行为&…

Spring Boot | SpringBoot 中 自定义 “用户授权管理“ : 自定义“用户访问控制“、自定义“用户登录控制“

目录: 一、SpringBoot 中 自定义 "用户授权管理" ( 总体内容介绍 ) :二、 自定义 "用户访问控制" ( 通过 "HttpSecurity类" 的 authorizeRequests( )方法来实现 "自定义用户访问控制" ) :1.基础项目文件准备2.实现 "自定义身份认…

4. 分布式链路追踪客户端工具包Starter设计

前言 本文将从零搭建分布式链路追踪客户端工具包的Starter&#xff0c;并将在后续文章中逐步丰富支持的场景。这里首先将搭建一个最基础的Starter&#xff0c;能提供的功能和1. 看完这篇文章我奶奶都懂Opentracing了一文中的示例demo类似。 相关版本依赖如下。 opentracing-…

【SQL】SQL常见面试题总结(4)

目录 1、空值处理1.1、统计有未完成状态的试卷的未完成数和未完成率1.2、0 级用户高难度试卷的平均用时和平均得分 2、高级条件语句2.1、筛选限定昵称成就值活跃日期的用户&#xff08;较难&#xff09;2.2、筛选昵称规则和试卷规则的作答记录&#xff08;较难&#xff09;2.3、…

SmartEDA助力电工基础实验:打造高效、智能的学习新体验

在电工基础实验的教学与学习中&#xff0c;传统的实验设备往往存在着操作复杂、数据处理繁琐等问题&#xff0c;给学生的学习带来了不小的挑战。然而&#xff0c;随着科技的不断发展&#xff0c;一种名为SmartEDA的智能电工实验辅助设备正逐渐走入课堂&#xff0c;以其高效、智…

Es6-对象新增了哪些扩展?

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Javascript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Javascript篇专栏内容:Es6-对象新增了哪些扩展&#xff1f; 目录 一、参数 二、属性 函数的length属性 …

数据结构-栈(带图)

目录 栈的概念 画图理解栈 栈的实现 fun.h fun.c main.c 栈的概念 栈&#xff08;Stack&#xff09;是一种基本的数据结构&#xff0c;其特点是只允许在同一端进行插入和删除操作&#xff0c;这一端被称为栈顶。遵循后进先出&#xff08;Last In, First Out, LIFO&#…

【论文粗读|arXiv】GaSpCT: Gaussian Splatting for Novel CT Projection View Synthesis

Abstract 本文提出了一种新颖的视图合成和3D场景表示方法&#xff0c;用于为计算机断层扫描&#xff08;CT&#xff09;生成新的投影视图。 方法采用了Gaussian Splatting 框架&#xff0c;基于有限的2D图像投影集&#xff0c;无需运动结构&#xff08;SfM&#xff09;方法&am…

Swift 5.9 中 if 与 switch 语句简洁新语法让撸码更带劲

概览 在实际代码开发中&#xff0c;可能初学 Swift 语言的小伙伴们在撸码时最常用的得数 if 和 switch…case 条件选择语句了。不过在某些场景下它们显得略有那么一丢丢“矫揉造作”&#xff0c;还好从 Swift 5.9 开始苹果知趣的为其简化了语法且增强了它们的表现力。 在本篇…

Vitis HLS 学习笔记--优化本地存储器访问瓶颈

目录 1. 简介 2. 代码解析 2.1 原始代码 2.2 优化后 2.3 分析优化措施 3. 总结 1. 简介 在Vitis HLS中&#xff0c;实现II&#xff08;迭代间隔&#xff09; 1是提高循环执行效率的关键。II1意味着每个时钟周期都可以开始一个新的迭代&#xff0c;这是最理想的情况&…