【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.rhkb.cn/news/491905.html

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

相关文章

Ubuntu系统安装MySQL

使用在线方式安装 更新软件包 sudo apt update安装MySQL服务器 # 查看可使用的安装包 sudo apt search mysql-server安装指定版本的MySQL # 安装指定版本 sudo apt install -y mysql-server-8.0如果不加-y 会在安装过程中&#xff0c;系统将提示你设置MySQL的root密码。记住…

解决git clone时报错“authentication failed for huggingface repository”

问题1&#xff1a; 已经获取了模型的授权&#xff0c;但是git clone时&#xff0c;弹出弹窗 输入huggingface的用户名和密码后&#xff0c;报错如下 解决方式1&#xff1a; 阅读红框标注的说明&#xff0c;“password authentication in git is no longer supported.”&#…

(css)鼠标移入或点击改变背景图片

(css)鼠标移入或点击改变背景图片 html <div class"mapTip"><divv-for"(item, index) of legendList":key"index"class"mapTipOne":class"{ active: change index }"click"legendHandle(item, index)"…

下一代测序技术在宏基因组学中的应用

随着生物技术的迅猛发展&#xff0c;下一代测序技术&#xff08;Next Generation Sequencing, NGS&#xff09;已成为现代生物学和医学研究的核心工具之一。NGS技术不仅极大地提高了DNA测序的速度和通量&#xff0c;还显著降低了测序成本。这些优势使得NGS在多个领域得到了广泛…

基于 iAP2 协议 的指令协议,用于对安防设备的 MCU 进行操作

协议设计目标 1. 安全性&#xff1a;通过 iAP2 协议与 MCU 设备进行安全通信。 2. 通用性&#xff1a;支持对安防设备的常见功能进行操作&#xff0c;如状态查询、设备控制、参数配置等。 3. 高效性&#xff1a;数据结构简洁清晰&#xff0c;易于解析和扩展。 4. 扩展性&#x…

了解ARM的千兆以太网——RK3588

1. 简介 本文并不重点讲解调试内容&#xff0c;重点了解以太网在ARM设计中的框架以及在设备树以及驱动的一个整体框架。了解作为一个驱动开发人员当拿到一款未开发过的ARM板卡应该怎么去把网卡配置使用起来。 2. 基础知识介绍 在嵌入式ARM中实现以太网的解决方案通常有以下两种…

随机森林算法原理

随机森林算法原理 算法流程随机森林的生成随机森林的预测 算法总结随机森林的优点随机森林的缺点 算法流程 随机森林的生成 输入训练数据 D&#xff0c;样本个数为 m &#xff0c;待学习的决策树数量为 T。 对于 t 1,2,…,T&#xff0c;从 D 中有放回地采样 m 次&#xff0c…

asp.net repeater嵌套

OnItemCreated方式 <%-- 一级Repeater绑定班级信息 --%><asp:Repeater ID"rptClassInfo" runat"server" OnItemCreated"rptClassInfo_ItemCreated"><ItemTemplate><div class"classInfo"><h3><%# Ev…

35. Three.js案例-创建带阴影的球体与平面

35. Three.js案例-创建带阴影的球体与平面 实现效果 知识点 WebGLRenderer WebGLRenderer 是Three.js中用于渲染场景的主要类之一&#xff0c;它负责将场景中的对象渲染到画布上。 构造器 new THREE.WebGLRenderer(parameters : Object) 参数类型描述parametersObject可选…

TouchGFX移植(2)STM32CubeMX配置

硬件平台&#xff1a;STM32F429IGT6 屏&#xff1a;7寸RGB&#xff0c; 1024 X 600分辨率 1&#xff09;选择芯片 2&#xff09;SYS配置 3&#xff09;RCC配置 4&#xff09;FMC配置&#xff08;驱动板载SDRAM&#xff09; 这里的配置需要结合硬件原理图的接线&#xff1a;…

数字IC后端设计实现篇之TSMC 12nm TCD cell(Dummy TCD Cell)应该怎么加?

TSMC 12nm A72项目我们需要按照foundary的要求提前在floorplan阶段加好TCD Cell。这个cell是用来做工艺校准的。这个dummy TCD Cell也可以等后续Calibre 插dummy自动插。但咱们项目要求提前在floorplan阶段就先预先规划好位置。 TSCM12nm 1P9M的metal stack结构图如下图所示。…

30.攻防世界unserialize3

进入场景 解读一下 这个类 xctf 中有一个公共属性 $flag &#xff0c;其值为 111 &#xff0c;并且定义了一个 __wakeup 魔术方法&#xff0c;当对象被反序列化时会自动调用该方法&#xff0c;该方法会输出 bad requests 并终止程序的执行。 ?code提示了参数 <?php clas…

串口UART

1.并行和串行通信 2.常见的串行通信 3.同步和异步通信。同步通信需要时钟信号&#xff0c;异步通信不需要时钟信号。 4.双工通信 5.串口UART常见的几种协议 6.ARM单片机硬件结构 GD32F303单片机串口连接方式。 7.串口寄存器 8.底层如何调用上层的函数&#xff0c;注册回调…

html基础-认识html

1.什么是html html是浏览器可以识别的的标记语言&#xff0c;我们在浏览器浏览的网页就是一个个的html文档 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>认识html</title> </head> <body><h1…

Elasticsearch问题总结

Fielddata access on the_id field is disallowed, you can re-enable it by updating the dynamic cluster setting: indices.id_field_data.enabledElasticsearch默认禁用_id字段进行排序&#xff0c;这是因为_id字段通常不需要进行聚合或排序操作&#xff0c;启用字段数据可…

程序的基本结构

图3.1 顺序结构 顺序结构 程序自上而下逐行执行&#xff0c;一条语句执行完之后继续执行下一条语句&#xff0c;一直到程序末尾 图3.2 分支结构 上图的程序执行流程为: 当判断条件为真时&#xff0c;执行语句1&#…

Fiddler勾选https后google浏览器网页访问不可用

一、说明 最近电脑重新安装系统后&#xff0c;之前的所有工具都需要重新安装和配置&#xff0c;有个项目需要抓包https包查看一下请求的内容&#xff0c;通过Fiddler工具&#xff0c;但是开启后&#xff0c;发现https的无法抓取&#xff0c;同时google浏览器也不无法访问互联网…

4.9 TCP 拥塞控制算法

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 1 TCP 拥塞控制算法1.1 慢开始&#xff08;Slow Start&#xff09;1.2 拥塞避免&#xff08;Congestion Avoidance&#xff09;1.3 快重传&#xff08;Fast Retransmit&#x…

【优选算法篇】模拟算法的艺术:在不确定性中找到解法(上篇)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

pytest入门九:feature

fixture是pytest特有的功能&#xff0c;用以在测试执行前和执行后进行必要的准备和清理工作。使用pytest.fixture标识&#xff0c;定义在函数前面。在你编写测试函数的时候&#xff0c;你可以将此函数名称做为传入参数&#xff0c;pytest将会以依赖注入方式&#xff0c;将该函数…