【Mybatis】MyBatis 探秘:#{} 与 ${} 参传差异解码,数据库连接池筑牢数据交互根基

前言

🌟🌟本期讲解关于Spring IOC&DI的详细介绍~~~

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

🔥 你的点赞就是小编不断更新的最大动力                                       

🎆那么废话不多说直接开整吧~~

目录

📚️1. #{} 与 ${}的使用

1.1integer类型数据

1.2String类型数据

📚️2. #{} 与 ${}的区别

2.1性能

2.2安全性 

📚️3.${ }使用场景

3.1排序

3.2模糊查询

📚️4.数据库连接池

4.1介绍

4.2使用

📚️5.总结

 

📚️1. #{} 与 ${}的使用

我们在之前的学习中,了解到了“#{}”,但是这里的${}是什么呢?其实这里的${}也具有参数传递的功能但是我们之前为什么不使用$符号呢?且听下面的分析过程~~~

1.1integer类型数据

我们可以通过id类整型参数的传递进行实验,首先得先创建一个数据库,如下所示:

接下来我们知己使用XML的方式进行代码的编写:

在Mapper类中:

 List<UserInfo> select2(Integer id);

 这里先定义数据的返回类型,然后再在XML文件中实现查询SQL的方法:

<select id="select2" resultType="com.example.mybatis.Model.UserInfo">select * from user_info where id=#{id}</select>

然后再测试类进行测试后们可以看到如下的打印的日志:

解释:

可以发现在SQL查询语句中,参数被“?”给替代了,然后下面的参数就是“2”,此时可以了解到我们输⼊的参数并没有在后⾯拼接,id的值是使⽤ ? 进⾏占位. 这种SQL 我们称之为"预编译SQL"

然后我们将这里的“#{ }” 替换成“${}”,具体的情况就是如下所示的:

解释:

可以发现此时SQL语句,就没有“?”,然后下面的paramters参数就为空了,然后我们就知道${} 会直接进⾏字符替换, ⼀起对SQL进⾏编译,不会像#号一样使用占位符;这种我们就称之为即时SQL

1.2String类型数据

这里我们使用String类来进行匹配查询,具体的操作还是和上面差不多;

Mapper类的代码如下:

 List<UserInfo> selectAllByUsername(String username);

然后再XML写SQL语句的操作:

解释:

此时可以看到,和上面的string类型的数据是一样的,这里会标明参数的类型为string类型,然后再进行替换占位的时候会自动添加引号;

然后我们将这里的“#{ }” 替换成“${}”,具体的情况就是如下所示的:

 <select id="selectAllByUsername" resultType="com.example.mybatis.Model.UserInfo">select * from user_info where username=${username}</select>

这里就是通过输入的名字进行查询,将这#号替换成了$符号,然后再测试类进行测试后打印的日志报错了,具体的打印日志如下所示:

解释:

这里可以看到此时的$符号的操作,出现了报错,原因就是BadSql,我们在上面看到,由于直接代替的原因,查询条件中字符串没有出现“ '  '  ”符号,即引号,然后就是SQL语句语法不正确导致错误;

解决办法:

在XML编写SQL语句的时候进行手动添加' ';

代码如下:

<select id="selectAllByUsername" resultType="com.example.mybatis.Model.UserInfo">select * from user_info where username='${username}'</select>

此时进行测试打印,打印的日志就是如下所示的:

解释:此时可以看到在字符串添加了“ ' ' ”双引号,然后参数仍然为空;

综上所述:

#{} 使⽤的是预编译SQL, 通过 ? 占位的⽅式, 提前对SQL进⾏编译, 然后把参数填充到SQL语句中. #{} 会根据参数类型, ⾃动拼接引号 '' .
${} 使用的就是即时编译SQL,会直接进⾏字符替换, ⼀起对SQL进⾏编译. 如果参数为字符串, 需要加上引号 ''

📚️2. #{} 与 ${}的区别

2.1性能

当客⼾发送⼀条SQL语句给服务器后, ⼤致流程如下:

1. 解析语法和语义, 校验SQL语句是否正确
2. 优化SQL语句, 制定执⾏计划
3. 执⾏并返回结果

⼀条 SQL如果⾛上述流程处理, 我们称之为 Immediate Statements(即时 SQL) 

但是绝⼤多数情况下, 某⼀条 SQL 语句可能会被反复调⽤执⾏, 或者每次执⾏的时候只有个别的值不同(⽐如 select 的 where ⼦句值不同, update 的 set ⼦句值不同, insert 的 values 值不同). 如果每次都需要经过上⾯的语法解析, SQL优化、SQL编译等,则效率就明显不⾏了

总结: 

所以预编译SQL就在执行上述的优化操作后,遇到同样的SQL语句,就不会对SQL进行再次的优化编译了,就直接改变参数,省去了解析优化等过程, 以此来提⾼效率

预编译SQL的性能比即时SQL的性能更高;

2.2安全性 

这里出现的安全性就是(SQL注入

SQL注⼊:是通过操作输⼊的数据来修改事先定义好的SQL语句,以达到执⾏代码对服务器进⾏攻击的⽅法。由于没有对⽤⼾输⼊进⾏充分检查,⽽SQL⼜是拼接⽽成,在⽤⼾输⼊参数时,在参数中添加⼀些SQL关键字,达到改变SQL运⾏结果的⽬的,也可以完成恶意攻击

注意:这里只针对的就是${ }符号;

假如我们在此符号中添加    ' or 1='1

然后在#{ }运行中,可以发现此时的此时的打印日志告诉我们,这里的字符串在数据库中没有找到

如下所示:

这里的结果确实如我们所料,但是在${ }符号中,如下所示:

解释:

哎奇怪,怎么会出现这种情况,这个字符串在我们的数据库列中就没有这个字段;但是为啥就全部搜索出来了呢??

因为拼接的问题和原因,所以这里出现了误判,'  {'    or     1='1}  ' 拼接后成了以下SQL语句

'  '    or     1='1'

解释:

具体的意思就是为空或者为true,这就是为啥全部搜索出来了,这里存在SQL关键字or;

所以SQL注⼊是⼀种⾮常常⻅的数据库攻击⼿段, SQL注⼊漏洞也是⽹络世界中最普遍的漏洞之⼀.
如果发⽣在⽤⼾登录的场景中, 密码输⼊为 ' or 1='1 , 就可能完成登录;

总之在后面的学习中能用#{} 那么就使用#{ },${ }非特殊情况尽量不要使用 

📚️3.${ }使用场景

3.1排序

在实现排序功能的时候,由于“desc”不需要使用引号,所以这里我们就可以使用${}符号

具体的代码如下所示:

<select id="selectAllById" resultType="com.example.mybatis.Model.UserInfo">select * from user_info order by id ${sort}</select>

这里即时XML的写法,可以看到此时order by id然后排序关键词,就不需要引号,那么此时我们就可以使用$符号;

在测试类中的实现代码:

 @Testvoid selectAllById() {userInfoXMLMapper.selectAllById("desc");}

我们这里就是按照降序排序进行查询结果的排序的,最后打印的日志如下所示:

解释:

上面的两行就是SQL语句和参数,参数为空,然后即时SQL进行拼接,SQL语句就成为了一个查询语句按照降排序的方式进行查询结果的展示;

3.2模糊查询

代码如下所示:

 <select id="selectByUsername" resultType="com.example.mybatis.Model.UserInfo">select * from user_info where username like '%${username}%'</select>

这里也是不需要引号,然后也可以使用$符号,在测试类中代码:

@Testvoid selectByUsername() {userInfoXMLMapper.selectByUsername("o");}

最后打印的日志如下所示:

解释:

这里的模糊查询,中间的参数是不需要自动添加引号的,并且这里的模糊查询的条件就是查找名字里包含“o”的那一段数据;

但是这里由于注入等安全性,这里我们可以使用#进行另一种写法,具体的代码如下所示:

 <select id="selectByUsername2" resultType="com.example.mybatis.Model.UserInfo">select * from user_info where username like concat('%',#{username},'%')</select>

解释:

这里使用concat关键字,实现需要引号的拼接操作,这样就可以使用#{}来进行参数的传递,几避免了SQL注入的安全问题,还可能提高了执行的效率;

📚️4.数据库连接池

4.1介绍

数据库连接池负责分配、管理和释放数据库连接,它允许应⽤程序重复使⽤⼀个现有的数据库连接,⽽不是再重新建⽴⼀个

没有使⽤数据库连接池的情况: 每次执⾏SQL语句, 要先创建⼀个新的连接对象, 然后执⾏SQL语句, SQL语句执⾏完, 再关闭连接对象释放资源. 这种重复的创建连接, 销毁连接⽐较消耗资源

使⽤数据库连接池的情况: 程序启动时, 会在数据库连接池中创建⼀定数量的Connection对象, 当客⼾请求数据库连接池, 会从数据库连接池中获取Connection对象, 然后执⾏SQL, SQL语句执⾏完, 再把Connection归还给连接池 

优点:

1. 减少了⽹络开销
2. 资源重⽤
3. 提升了系统的性能 

4.2使用

常⻅的数据库连接池:

• C3P0
• DBCP
• Druid
• Hikari

主流就是Hikari,Druid;

我们的SpringBoot默认使用的就是Hikari;日志如下所示:

可以看到这就是springboot默认使用的就是Hikari;

📚️5.总结

本期小编主要讲解了关于#{ },${ },的区别与如何进行使用,讲解了两者的性能比较,比较重要的SQL注入的问题,以及简单的阐述了数据库连接池的介绍~~~

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

       😊😊  期待你的关注~~~

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

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

相关文章

解锁 draw.io 流程图制作工具的强大功能与应用(1/2)

一、draw.io 简介 &#xff08;一&#xff09;基本概述 draw.io 是一款由 JGraph 公司开发的基于网页的在线图表绘制工具。它最大的优势之一就是无需进行繁琐的下载和安装步骤&#xff0c;只要打开浏览器&#xff0c;访问其官网&#xff0c;就能立即开始使用。无论是在 Window…

ai论文写作免费平台:五款AI论文写作辅助工具的对比与分析

随着人工智能技术的飞速发展&#xff0c;越来越多的AI工具应运而生&#xff0c;为学术写作带来了前所未有的便利。本文将对千笔AI论文、笔灵AI论文、Smodin、以及Notion AI等五款AI论文写作辅助工具进行全面的对比与分析&#xff0c;以帮助用户更好地了解这些工具的优势和特点&…

三、基于langchain使用Qwen搭建金融RAG问答机器人--检索增强生成

经过前面2节数据准备后&#xff0c;现在来构建检索 加载向量数据库 from langchain.vectorstores import Chroma from langchain_huggingface import HuggingFaceEmbeddings import os# 定义 Embeddings embeddings HuggingFaceEmbeddings(model_name"m3e-base")#…

数据仓库工具箱—读书笔记02(Kimball维度建模技术概述02、事实表技术基础)

Kimball维度建模技术概述 记录一下读《数据仓库工具箱》时的思考&#xff0c;摘录一些书中关于维度建模比较重要的思想与大家分享&#x1f923;&#x1f923;&#x1f923; 第二章前言部分作者提到&#xff1a;技术的介绍应该通过涵盖各种行业的熟悉的用例展开&#xff08;赞同…

fabric.js

目录 一、在canvas上画简单的图形 二、在canvas上用路径(Path)画不规则图形 三、在canvas上插入图片并设置旋转属性(angle) 四、让元素动起来(animate) 五、图像过滤器(filters)让图片多姿多彩 六、颜色模式(Color)和相互转换(toRgb、toHex) 七、对图形的渐变填充(Gradi…

Liinux下VMware Workstation Pro的安装,建议安装最新版本17.61

建议安装最新版本17.61&#xff0c;否则可能有兼容性问题 下载VMware Workstation安装软件 从官网网站下载 https://support.broadcom.com/group/ecx/productdownloads?subfamilyVMwareWorkstationPro 选择所需版本 现在最新版本是17.61&#xff0c;否则可能有兼容性问题…

压力测试Jmeter简介

前提条件&#xff1a;要安装JDK 若不需要了解&#xff0c;请直接定位到左侧目录的安装环节。 1.引言 在现代软件开发中&#xff0c;性能和稳定性是衡量系统质量的重要指标。为了确保应用程序在高负载情况下仍能正常运行&#xff0c;压力测试变得尤为重要。Apache JMeter 是一…

前端的知识(部分)

11 前端的编写步骤 第一步:在HTML的页面中声明方法 第二步:在<script>中定义一个函数,其中声明一个data来为需要的数据 赋值一个初始值 第三步:编写这个方法实现对应的功能

LSTM详解

1. LSTM设计 LSTM(长短期记忆网络)详解 长短期记忆网络(LSTM, Long Short-Term Memory) 是一种特殊的循环神经网络(RNN),特别适合处理和预测序列数据中的长时间依赖关系。LSTM 通过引入“门机制”(如输入门、遗忘门、输出门)来解决标准 RNN 在长时间序列任务中梯度消…

我在广州学 Mysql 系列之 数据类型和运算符详解

ℹ️大家好&#xff0c;我是&#x1f606;练小杰&#xff0c;今天主要学习 Mysql的数据类型以及运算符操作~~ 上周五学习了“Mysql 系列之 数据“表”的基本操作”~ 想要了解更多&#x1f236;️MYSQL 数据库的命令行总结&#xff01;&#xff01;&#xff01; “我是你的敌人,…

python 配置 oracle instant client

1.问题描述 想用python连接oracle数据库&#xff0c;百度得知需要cx_Oracle这个第三方库 import cx_Oracle# 设置Oracle数据源名称 dsn cx_Oracle.makedsn(host, port, service_nameservice_name)# 创建数据库连接 connection cx_Oracle.connect(userusername, passwordpas…

使用FastGPT制做一个AI网站日志分析器

越来越的多网站面临每天上千次的扫描和各类攻击&#xff0c;及时发现攻击IP&#xff0c;并有效的屏蔽不良访问成为网站安全的重要保障&#xff0c;这里我们使用AI来完成对网站日志的日常分析。 我们来使用FastGPT来制做一个AI网站日志析器&#xff0c;下面就开始&#xff1a; …

RabbitMQ中的Work Queues模式

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信和解耦系统的关键组件之一。RabbitMQ 是一个广泛使用的开源消息代理软件&#xff0c;支持多种消息传递模式。其中&#xff0c;Work Queues&#xff08;工作队列&#xff09;模式是一…

【Python爬虫系列】_032.Scrapy_全站爬取

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈

音频声音太小怎么调大?调大音频声音的几种方法

音频声音太小怎么调大&#xff1f;音频声音过小可能由多种原因引起。从设备本身的硬件设置&#xff0c;到应用程序或播放软件的音量控制&#xff0c;再到文件本身的音频质量&#xff0c;都可能是导致声音过小的因素。尤其是在观看视频或听音乐时&#xff0c;若音量过低&#xf…

条件随机场(CRF)详解:原理、算法与实现(深入浅出)

目录 1. 引言2. 什么是条件随机场&#xff1f;2.1 直观理解2.2 形式化定义 3. CRF的核心要素3.1 特征函数3.2 参数学习 4. 实战案例&#xff1a;命名实体识别5. CRF vs HMM6. CRF的优化与改进6.1 特征选择6.2 正则化 7. 总结与展望参考资料 1. 引言 条件随机场(Conditional Ra…

基于Clinical BERT的医疗知识图谱自动化构建方法,双层对比框架

基于Clinical BERT的医疗知识图谱自动化构建方法&#xff0c;双层对比框架 论文大纲理解1. 确认目标2. 目标-手段分析3. 实现步骤4. 金手指分析 全流程核心模式核心模式提取压缩后的系统描述核心创新点 数据分析第一步&#xff1a;数据收集第二步&#xff1a;规律挖掘第三步&am…

LWIP协议:三次握手和四次挥手、TCP/IP模型

一、三次握手&#xff1a;是客户端与服务器建立连接的方式&#xff1b; 1、客户端发送建立TCP连接的请求。seq序列号是由发送端随机生成的&#xff0c;SYN字段置为1表示需要建立TCP连接。&#xff08;SYN1&#xff0c;seqx&#xff0c;x为随机生成数值&#xff09;&#xff1b;…

使用winscp从windows访问Ubuntu进行文件传输

Ubuntu 系统上的准备工作 • 安装 SSH 服务器&#xff1a; 确保 Ubuntu 系统上已经安装了 SSH 服务器。如果没有安装&#xff0c;可以使用以下命令安装&#xff1a; sudo apt update sudo apt install openssh-server • 启动 SSH 服务&#xff1a; 确保 SSH 服务正在运行&a…

[机器学习]AdaBoost(数学原理 + 例子解释 + 代码实战)

AdaBoost AdaBoost&#xff08;Adaptive Boosting&#xff09;是一种Boosting算法&#xff0c;它通过迭代地训练弱分类器并将它们组合成一个强分类器来提高分类性能。 AdaBoost算法的特点是它能够自适应地调整样本的权重&#xff0c;使那些被错误分类的样本在后续的训练中得到…