简述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.rhkb.cn/news/329289.html

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

相关文章

使用决策树对金融贷款数据进行分析

使用决策树对金融贷款数据进行分析 在本篇博客中&#xff0c;我们将通过使用 Python、Pandas 和多种机器学习技术&#xff0c;对一组贷款数据进行全面分析。通过详细的步骤展示&#xff0c;你将学会如何进行数据预处理、可视化分析以及构建预测模型。 第一步&#xff1a;导入…

计算机网络之传输层知识点总结

5.1 传输层 &#xff08;1&#xff09;传输层介绍 &#xff08;2&#xff09;传输层的两个协议 &#xff08;3&#xff09;传输层的寻址与端口 5.2 UDP协议 &#xff08;1&#xff09;用户数据报协议UDP介绍 &#xff08;2&#xff09;UDP首部格式 &#xff08;3)UDP校验 …

一顿五元钱的午餐

在郑州喧嚣的城市一隅&#xff0c;藏着一段鲜为人知的真实的故事。 故事的主角是一位年过半百的父亲&#xff0c;一位平凡而又伟大的劳动者。岁月在他脸上刻下了深深的痕迹&#xff0c;但他眼神中闪烁着不屈与坚韧。 他今年52岁&#xff0c;为了给远在家乡的孩子们一个更好的…

面试准备-项目【面试准备】

面试准备-项目【面试准备】 前言面试准备自我介绍&#xff1a;项目介绍&#xff1a; 论坛项目功能总结简介数据库表设计注册功能登录功能显示登录信息功能发布帖子评论私信点赞功能关注功能通知搜索网站数据统计热帖排行缓存 论坛项目技术总结Http的无状态cookie和session的区别…

汇编小习题

彩笔好笨啊&#xff0c;知道原理还能写错。 1. 注释下面代码 Title Simple Add .386 ;使用80386指令集 .model flat, stdcall;内存模型为平坦模型&#xff0c;子程序采用stdcall约定 .stack 4096;为运行时堆栈分配4096空间 ExitProcess proto , dwExitCode:DWORD;为过程创建过…

从零开始搭建SpringCloud Alibaba微服务架构

Spring Cloud Alibaba是Spring Cloud的一个拓展项目&#xff0c;它用于构建基于阿里巴巴的微服务应用。它提供了多个阿里巴巴的开源组件&#xff0c;如Nacos、Sentinel、Dubbo等&#xff0c;用于解决微服务架构中的服务注册、配置管理、流量控制等问题。 Spring Cloud Alibaba…

QT控件QDialog结合QDialogButtonBox实现确认弹窗

项目需要二次确认开启&#xff0c;添加一个确认弹窗&#xff0c;采用QDialog并添加按钮控件。 QDialogButtonBox控件用于添加按钮组&#xff0c;初始化时可以增加标准按键&#xff0c;但是不能自定义按钮文字。 想要更改按键大小&#xff0c;但是没有提供设置组内按钮大小的函数…

使用Python生成一束玫瑰花

520到了&#xff0c;没时间买花&#xff1f;我们来生成一个电子的。 Python不仅是一种强大的编程语言&#xff0c;用于开发应用程序和分析数据&#xff0c;它也可以用来创造美丽的艺术作品。在这篇博客中&#xff0c;我们将探索如何使用Python生成一束玫瑰花的图像。 准备工作…

0407放大电路的频率响应

放大电路的频率响应 单时间常数RC电路的频率响应中频响应高频响应低频响应全频域响应 放大电路频率响应概述1. 直接耦合放大电路频域响应阻容耦合放大电路频域响应 4.7.1 单时间常数RC电路的频率响应 4.7.2 放大电路频率响应概述 4.7.3 单级共射极放大电路的频率响应 4.7.4 单级…

【笔记】软件架构师要点记录(2)

【笔记】软件架构师要点记录 20240523案例一案例二案例三案例四案例五案例六案例七案例十 20240523 基于前10个架构案例场景&#xff0c;对用到的专业术语进行整理&#xff0c;方便后续查看。 案例一 MVC架构风格组件交互方式 MVC是一种用来构建用户界面时采用的架构设计风格…

142.栈和队列:用栈实现队列(力扣)

题目描述 代码解决 class MyQueue { public:stack<int> stIn; // 输入栈&#xff0c;用于push操作stack<int> stOut; // 输出栈&#xff0c;用于pop和peek操作MyQueue() {}void push(int x) {stIn.push(x); // 将元素压入输入栈}int pop() {// 如果输出栈为空&…

Linux 信号捕捉与处理

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; ​ 目录 前言 1. 信号的处理时机 1.1用户…

jiebaNET中文分词器

最近我接手了一个有趣的需求&#xff0c;需要对用户评价进行分词&#xff0c;进行词频统计和情绪分析&#xff0c;并且根据词频权重制成词云图以供后台数据统计&#xff0c;于是我便引入了jieba分词器,但是我发现网上关于jiebaNET相关文档实在太少了&#xff0c;甚至连配置文件…

知识分享|非凸问题求解方法及代码示例【分类迭代】【大M法】

主要内容 之前发布了非线性问题线性化的几种方法&#xff0c;如知识分享|分段函数线性化及matlab测试&#xff0c;学习园地 | yalmip实用操作-线性化&#xff0c;非线性优化 | 非线性问题matlabyalmip求解案例&#xff0c;但是在实际建模及编程过程中&#xff0c;会遇到各种…

【C++】学习笔记——map和set

文章目录 十五、map和set1. 关联式容器2. set的介绍3. set的使用4. multiset5. map的介绍6. map的使用7. multimap8. map中重载的operator[] 未完待续 十五、map和set 1. 关联式容器 我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector 、list 、deque 等&…

抖音小店什么产品最好卖?六月份的必爆产品!商家抓紧上架!

哈喽~我是电商月月 做抖音小店&#xff0c;爆款是非常吃香的&#xff0c;但普通玩家只有在爆款出来的那几天才能发现&#xff0c;再去截流&#xff0c;其实热度已经不高了&#xff0c;那想吃到这一口“螃蟹”只能自己去挖掘 每年爆的产品就是那几种&#xff0c;我们可以朝这几…

HackTheBox-Machines--Bank

文章目录 0x01 信息收集0x02 文件上传漏洞利用0x03 权限提升方法一&#xff1a;SUID提权方法二&#xff1a;配置不当提权 Bank 测试过程 0x01 信息收集 1.端口扫描 发现 ssh(22)、DNS(53)、HTTP(80) 端口 nmap -sC -sV 10.129.29.200访问 80 端口&#xff0c;页面为Apache2 U…

非授权人员进入报警系统

非授权人员进入报警系统基于智能视频分析技术和深度学习技术&#xff0c;非授权人员进入报警系统通过现场已经装好的监控摄像头针对人体进行精准检测&#xff0c;并根据设置的禁入区范围进行判断。通过图像处理和人体识别算法&#xff0c;非授权人员进入报警系统可以在实时监测…

鸿蒙HarmonyOS开发中的易混点归纳-持续补充中

相关文章目录 鸿蒙HarmonyOS开发术语全解&#xff1a;小白也能看懂&#xff01; 文章目录 相关文章目录前言一、build()函数和Builder装饰器&#xff1f;二、自定义组件和系统组件&#xff08;内置组件&#xff09;三、组件和页面四、自定义弹窗和其他弹窗总结 前言 一、build…

一个通过ADC采集NTC热敏电阻的温度传感器

前言: 如何设计一个电路,使用具有逐次逼近寄存器(SAR)模数转换器(ADC)的热敏电阻直接监测温度呢?温度传感电路需要使用负温度系数(NTC)热敏电阻与电阻器串联形成分压器,监测-25C至100C的温度范围。分压器具有产生与监测的温度成反比的输出电压的效果。电阻器分压器的…