MyBatis进阶

目录

一、实现多表查询

二、#{}和${}

1、#{}和${}的使用

2、#{}和${}的区别

3、${}的使用场景

三、数据库连接池

1、数据库连接池概念

2、常见数据库连接池

3、修改连接池为Hikari

四、动态sql语句--xml

1、if标签

2、tirm标签

3、where标签

4、set标签

5、foreach标签

6、include标签

五、动态sql语句--注解


一、实现多表查询

1、准备两张表

userinfo表:

对应实体类:

articleinfo表:

对应实体类:

2、执行sql语句

若要查articleinfo表中id为1的书信息和用户信息,则需要进行多表查询。

多表查询的sql语句:select ta.id,ta.title,ta.content,ta.uid,tb.username,tb.age,tb.gender,tb.phone from articleinfo ta left join userinfo tb on ta.uid = tb.id where ta.id=1.

这时需要增加ArticleInfo类的属性,从而来接收多表查询的结果。

3、代码实现

4、测试

运行结果:

二、#{}和${}

#{}和${}都可以用于取参数值

1、#{}和${}的使用

(1)Integer类型的参数--根据id查询用户

#{}:

${}:

发现#{}是预编译sql,有?进行占位;${}是即时sql。

(2)String类型的参数--根据username查询用户

#{}:

${}:

当参数是字符串时,${}接收参数时,无法加引号,导致无法识别。

接收参数时将引号加上:

2、#{}和${}的区别

(1)#{}是预编译sql,性能更高;${}是即时sql。

即时sql的步骤:①解析语法和语义,检验sql语法是否正确;②优化sql语句,制定执行计划;③执行并返回结果。

预编译sql与即时sql的区别:一个sql语句若被反复执行或只是参数改变的,每一次执行若都需要经过以上步骤的话,则效率就会下降。此时预编译sql就会进行优化,编译一次sql语句后,就会将sql语句缓存起来,后面再执行这条语句时,不会再次编译,省去了解析优化等过程,直接执行,以此来提高效率。

(2)#{}更安全,${}有sql注入的风险。

sql注入:通过操作输入的参数,从而修改定义好的sql语句,已达到执行代码对服务器的攻击。

eg:根据username查询用户

正常输入username就会查询,但若进行sql注入的话:

'or 1='1一直为真,导致查询到所有结果。此时就是sql注入问题。

3、${}的使用场景

(1)排序功能

查询所有用户,并根据id升序

sql语句:select id,username,'password',age,gender,phone,delete_flag,create_time,update_time from userinfo order by id asc

#{}:

运行结果:

?处不应该有引号,所以不能使用#。

${}:

但需要考虑sql注入的问题,可以考虑升序和降序对应两个url,获取到url后由后台处理参数,客户端不输入参数。

(2)模糊匹配

查询姓名是‘l’开头的用户

sql语句:select id,username,'password',age,gender,phone,delete_flag,create_time,update_time from userinfo where username like '%l%';

#{}:

?处不应该有引号,所以不能使用#。

${}:

但需要考虑sql注入的问题,可以进行字符串拼接:

三、数据库连接池

1、数据库连接池概念

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

没有使用数据库连接池:每次在执行sql语句时,都需要重新进行数据库连接,建立一个新的连接对象,然后执行sql语句,语句执行完成后,再关闭连接释放资源。再次执行语句时,重复操作。这种重复的创建连接、释放资源比较消耗资源。

使用数据库连接池:程序启动时,会在数据库连接池创建一定数量的连接对象。每次在执行sql语句时,从线程池中拿连接对象,然后执行sql语句,语句执行完成后,再将连接对象放回连接池。减少了资源利用。

2、常见数据库连接池

C3P0、DBCP、Druid、Hikari。

springboot默认使用连接池为Druid

3、修改连接池为Hikari

引入相关依赖即可:

四、动态sql语句--xml

1、if标签

对于有一些属性,有默认值,比如userInfo中的gender的默认值为0,若该属性为非必填字段,如何使得不填值时为默认值,而不是为空值,此时可以使用if标签

(1)不使用if标签,gender不填值效果:

运行结果:

(2)使用if标签,gender不填值效果:

运行结果:

(3)if标签存在的问题

eg:

增加一个phone为空的userInfo对象,运行结果:

既然这样不行,那将逗号移到前面:

增加一个username为空的userInfo对象,运行结果:

我们发现,将逗号移到后面时,当最后一个属性为空时会报错;将逗号移到前面时,当第一个属性为空时会报错。有没有什么方法可以使得第一个属性为空时前面不会多一个逗号,最后一个属性为空时后面不会多一个逗号。考虑trim标签

2、tirm标签

(1)4个属性

(2)使用tirm标签解决上述问题

使用prefixOverrides删除前面多余逗号,使用suffixOverrides删除后面多余逗号;

可以使用prefix加'(',使用suffix加')'。

此时就可以很好的解决逗号问题了。

3、where标签

(1)不使用where标签存在的问题

根据username和age查询用户:

根据姓名为空的userInfo对象进行查询:

和逗号一样的问题,前一个属性为空,导致多出一个and,可以使用where标签解决问题。为什么不使用trim标签解决and问题???因为当属性都为空时,where也需要删除,但trim标签只能规定删除and,不能删除where,而where标签可以做到。

(2)where标签解决问题

此时就可以解决上述问题了。

4、set标签

可以解决在进行update操作时,删除可能多出的逗号,当然trim标签也可以。

5、foreach标签

对集合进行遍历时可以使用该标签。

例如:当需要删除多个用户时,传入的用户id就是一个集合,就需要遍历集合,根据id找到信息,从而进行删除。

运行结果:

6、include标签

可以对重复的代码片段进行抽取,降低冗余性。通过sql标签封装到一个SQL片段,然后再通过include标签进行引用。

代码实现:

include标签使用:

五、动态sql语句--注解

注解方法不推荐使用,单引号问题比较繁琐,且注解和xml的做法大同小异,以delete举个例子就能明白如何写了。

主要是在xml基础上加script标签,但要考虑单引号,不建议使用。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

win10开机黑屏,只有鼠标,解决方案

问题描述 win10进不去桌面,可以进去锁屏,只有鼠标,也能进去任务管理器(ctrlwindelete), 问题分析 进入任务管理器->文件->运行新任务 然后输入 explorer.exe 发现找不到了 原因:误删explorer.exe …

Kubernetes部署及运用

Kubernetes 1. Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与 缺点&#xf…

【kubernetes】关于k8s集群中kubectl的陈述式资源管理

目录 一、k8s集群资源管理方式分类: (1)陈述式资源管理方式:增删查比较方便,但是改非常不方便 (2)声明式资源管理方式:yaml文件管理 二、陈述式资源管理方法: 三、ku…

GCN,R-GCN,岭回归,SVR,随机森林,Adaboost

图卷积神经网络(graph convolutional network, GCN),它将卷积神经网络拓展到图结构形式 中,GCN因可以很好地融合图结构数据的结构特征和属性特征并且有较好的组合泛化能力而被广泛使用。 关系图卷积神经网络(relational-graph convolutional network, R-GCN)&#…

事件循环解析

浏览器的进程模型 何为进程? 程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程 每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。 何为线程? 有了进程后&…

蓝桥杯STM32G431RBT6实现按键的单击、双击、长按的识别

阅读引言: 是这样, 我也参加了这个第十五届的蓝桥杯,查看竞赛提纲的时候发现有按键的双击识别, 接着我就自己实现了一个按键双击的识别,但是识别效果不是特别理想,偶尔会出现识别不准确的情况,接…

lv21 QT 常用控件 2

1 QT GUI 类继承简介 布局管理器 输出控件 输入控件 按钮 容器 2 按钮示例 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QCheckBox> #include <QLineEdit> #include <QPushButton>class Widget : public QWidget {Q_OBJECTpublic…

Groovy(第五节) Groovy 之集合

Groovy 可以直接在语言内使用集合。在 Groovy 中,不需要导入专门的类,也不需要初始化对象。集合是语言本身的本地成员。Groovy 也使集合(或者列表)的操作变得非常容易,为增加和删除项提供了直观的帮助。 可以将范围当作集合 在前一节学习了如何用 Groovy 的范围将循环变得…

unity学习(42)——创建(create)角色脚本(panel)——UserHandler(收)+CreateClick(发)——服务器收包1

1.首先保证服务器接受到的信息正确&#xff0c;在服务器的LogicHandler.cs中做第一次分拣&#xff1a; public void process(Session session, SocketModel model) {try{switch (model.Type){case 0:LoginHandler.getInstance().process(session, model);break;case 1:MapHand…

项目登录方案选型

一.Cookie + Session 登录 大家都知道,HTTP 是一种无状态的协议。无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求返回数据,但不会记录任何信息。为了解决 HTTP 无状态的问题,出现了 Cookie。Co…

LeetCode--134

134. 加油站 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个整数数组 …

蓝桥杯备战刷题one(自用)

1.被污染的支票 #include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; int main() {int n;cin>>n;vector<int>L;map<int,int>mp;bool ok0;int num;for(int i1;i<n;i){cin>>nu…

leetcode 3.反转链表;

1.题目&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 2.用例&#xff1a; 3.题目解析&#xff1a; &#xff08;1&#xff09;函数头&#xff1a; 要求返回结点&#xff0c;就 ListNode* reverseList(ListNode* head)&…

标准库中的String类 String(C++)【1】

学习String的时候我是对照https://legacy.cplusplus.com/这个网站进行理解 标准库中的String类 string类的基础String的特点String常用的接口&#xff08;黑框标记的是常用接口&#xff09;构造函数string类对象的访问及遍历操作第一种 下标[ ]第二种 迭代器第三种 范围for st…

[C++]使用C++部署yolov9的tensorrt模型进行目标检测

部署YOLOv9的TensorRT模型进行目标检测是一个涉及多个步骤的过程&#xff0c;主要包括准备环境、模型转换、编写代码和模型推理。 首先&#xff0c;确保你的开发环境已安装了NVIDIA的TensorRT。TensorRT是一个用于高效推理的SDK&#xff0c;它能对TensorFlow、PyTorch等框架训…

树莓派使用git clone时报错failed: The TLS connection was non-properly terminated.

fatal: unable to access https://github.com/jacksonliam/mjpg-streamer.git/: gnutls_handshake() failed: The TLS connection was non-properly terminated. 原因&#xff1a;权限不足 解决办法&#xff1a;sudo git clone 加对应网址。 sudo git clone https://github.co…

单机取证-信息安全管理与评估-2022年国赛真题-环境+wp

🍬 博主介绍 博主介绍:大家好,我是 Mikey ,很高兴认识大家~ 主攻:【应急响应】 【python】 【数字取证】【单机取证】【流量分析】【MISC】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步 作者水平有限,欢迎各…

ChatGPT 4 教你完成学生表,教师表,课程表,选课表之间的SQL学习第二部分

数据源准备&#xff1a; # 学生表 create table student( sno varchar(10) primary key, #学号sname varchar(20), #姓名sage int(2), #年龄ssex varchar(5) #性别 ); #教师表 create table teacher( tno varchar(10) primary …

江科大stm32 定时器 TIM输出比较--学习笔记

这几天遇到输出比较相关的问题&#xff0c;于是来学习下TIM输出比较部分知识点&#xff01; 输出比较简介 CNT是计数器的值&#xff0c;CCR寄存器是捕获/ 比较寄存器 简单的讲&#xff0c;输出比较就是用来输出PWM波形。 PWM简介 占空比&#xff1a;高电平占一个周期的比例。…

计算机网络实验一 ENSP模拟器使用

实验一 eNSP模拟器的使用 学习目标&#xff1a; 1&#xff09;掌握eNSP模拟器的基本设置方法 2&#xff09;掌握使用eNSP搭建简单的端到端&#xff08;主机&#xff09;网络的方法 3&#xff09;掌握在eNSP中使用wireshark捕获IP报文的方法 4&#xff09;掌握设备的基本配置方…