当前位置: 首页 > news >正文

JavaEE进阶---Mybatis(预编译SQL即时SQL动态SQL标签池化技术说明)

文章目录

  • 1.经典面试题(#{}和${}的区别)
    • 1.1关于#
    • 1.2关于$
    • 1.3情况下需要使用$
  • 2.数据库连接池
    • 2.1池化技术图解
  • 3.动态SQL
    • 3.1if标签的使用
    • 3.2where标签的使用
    • 3.3set标签的使用

1.经典面试题(#{}和${}的区别)

1.1关于#

预编译SQL:这个其实是我们使用的比较多的,而且这个的性能和下面的这个$相比较,他的这个性能会更高一些;

我们的这个预编译SQL相当于就是提前占据位置:因为我们可以在运行起来的时候查看这个控制台里面的日志,发现我们在这个#{}里面的这个内容在我们的这个程序看来就是?

然后就是根据我们传递的参数把这个参数放到那个?的位置上面去几个,这个就是提前占座的功能,有参数了直接传递过去,仅此而已;

image-20250323164156911

1.2关于$

即时SQL:这个相当于说的就是我们的这个SQL是拼接得到的,这个就很容易出现问题,而且我们在使用的时候需要加上这个单引号,写起来也是相对而言比较麻烦的;

存在SQL注入的风险+即时SQL相当于是进行字符串的拼接的效果;

1.3情况下需要使用$

这个$存在这个SQL注入的问题需要我们去处理和解决,而且好像写起来也不是很方便,为什么这个方式依然存在呢,这个是因为他肯定是有自己不可替代的这个地方的,不然的话#{}也不会允许他存在,他必然可以做出来#{}做不成的事情;

排序功能,asc和desc(升序和降序),这个场景就是我们的#{}无法实现的,因为这个时候如果我们使用#{}就会在这个关键字的外面去添加这个引号,这个时候就会报错,因此在这个场景下面,必须要使用${}这样的写法,这个情况下字符串的拼接正好是符合要求的;

2.数据库连接池

2.1池化技术图解

就是这个的这个mybatis是下面的第二个情况,也就是说这个事引入了链接吃的,好处就是我们的这个connection全部都在池子里面,用户直接从这个池子里面取出来就行了,使用完了再放进去即可;

但是没有连接池的时候,我们的用户需要直接和这个数据库打交道,这个也算是我们的池子的特点,类似于之前学习的这个生产者消费者模型;

image-20250323173359487

3.动态SQL

3.1if标签的使用

动态SQL主要是处理这个xml里面的数据库内容查询的时候使用的:

下面的是两个if双标签,第一个标签判断我们的这个性别是不是空的,另外一个双标签负责判断我们的这个values里面的这个内容,相当于就是把我们的这个插入语句里面使用到gender的地方全部使用if标签进行处理一下;

image-20250323191128505

3.2where标签的使用

下面的这个就是select语句,我们对于查询的相关属性使用这个if标签进行判断这个age,hender,deleteFlag是不是空的,其他的都是一样的;

image-20250323185633785

除了使用上面的这个if标签,我们还可以使用下面的这个where标签,where标签可以生成这个where关键字,并且去掉这个and:下面的这个就是两个之间的对比;

下面的这个prefix表示的就是去电这个前缀,因为你会发现上面的这个里面出现的and gender=#{} and deleteFlag=#{}都有这个and单词,因此我们可以使用prefix进行说明,这样我们的标签里面就不用写了;

image-20250323190024208

3.3set标签的使用

set标签主要是处理我们的这个修改的SQL相关语句,suffix主要是去去掉我们的代码块的后缀(下面的两个图片左边的是trim标签,右边的是set标签);

因为我们的SQL语句里面是不应该有这个逗号的,但是我们下面的这个属性使用预编译SQL的时候需要使用逗号,因此我们添加这个suffix进行过滤去除掉;

该有这个逗号的,但是我们下面的这个属性使用预编译SQL的时候需要使用逗号,因此我们添加这个suffix进行过滤去除掉;

image-20250323191255267

相关文章:

  • 堆的相关要点以及模拟实现
  • 快速部署Samba共享服务器作为k8s后端存储
  • 透析主流CSS预处理器的区别
  • 红蓝队自动化项目资产侦察武器库部署企查产权网络空间
  • Excel(实战):INDEX函数和MATCH函数、INDEX函数实战题
  • TDengine 中的 show 命令
  • Scratch游戏 | 《拍苍蝇》——Scratch厨房清洁大作战!
  • 【NLP 42、实践 ⑪ 用Bert模型结构实现自回归语言模型的训练】
  • centos7搭建postgresql12主从
  • Node.js 格式化时间的两种方法:原生 Date 与 npm 包 moment 详解
  • [运维]Windows 开启 Hyper-V 之后上传网速变慢解决方案
  • 2025清华大学:DeepSeek教程全集(PDF+视频精讲,共10份).zip
  • Spring MVC 执行流程:一个请求在 Spring MVC 中是如何执行的?
  • css的背景
  • Linux Namespace(网络命名空间)系列二 --- 使用 Open vSwitch 和网络命名空间搭建虚拟网络
  • 前后端开发中,图片上传到不同格式(二进制数据ORbase64编码)
  • nuxt项目 详情页有阅读次数需要更新,有热门推荐列表需要更新适合做SSG吗
  • JSON相关的Java库使用指南
  • 本地部署 LangManus
  • 使用VS2022编译CEF
  • 智能手表眼镜等存泄密隐患,国安部提醒:严禁在涉密场所使用
  • 国产水陆两栖大飞机AG600批产首架机完成总装下线
  • 他站在当代思想的地平线上,眺望浪漫主义的余晖
  • 牛市早报|中美经贸高层会谈达成重要共识,取得实质性进展
  • 宣布停火后,印控克什米尔地区再次传出爆炸声
  • 新华时评:中国维护国际经贸秩序的立场坚定不移