多表查询、事务、Mybatis(javaweb第八天)

多表查询

笛卡尔积:
在数学中,两个集合的所有组合情况

连接查询:

内连接

查询A,B交集部分数据

隐式内连接:
select 字段列表 from 表1,表2 where 条件 、、、;

显示内连接:
select 字段列表 from 表1 [inner] join 表2 on 连接条件 、、、;

给表起别名和给字段起别名类似,表名 别名
注意:起别名之后不能用原名

外连接:

右外连接:查询右表所有数据(包含交集)
select 字段列表 from 表1 right [outer] join 表2 on 连接条件、、、;

左外连接:查询左表所有数据(包含交集)
select 字段列表 from 表1 left [outer] join 表2 on 连接条件、、、;

子查询

SQL语句中嵌套select语句,称为嵌套语句,又称子查询

形式:
select * from t1 where column1=(select column1 from t2 、、、);

子查询外部的语句可以是insert/update/delete/select的任何一个,最常见select

分类:
标量子查询:子查询返回的结果为单个值
操作符:= 、!=、>、<等

列子查询:子查询返回的结果为一列
操作符:in、not in

行子查询:子查询返回的结果为一行
= 、!=、>、<、n、not in
匹配多个字段可以使用:(字段1,字段2)=(值1,值2)

表子查询:子查询返回结果为多行多列
作为表使用
in

连接方式匹配行为是否保留不匹配
INNER JOIN,只保留匹配上的记录(交集)❌ 不保留
LEFT JOIN保留左表所有记录,右边匹配失败为 NULL✅ 保留左表不匹配
RIGHT JOIN保留右表所有记录,左边匹配失败为 NULL✅ 保留右表不匹配
FULL JOIN(部分数据库支持)保留左右两边所有记录,匹配失败补 NULL✅ 全保留

写SQL步骤:
先看用到什么表
根据条件写

事务

一组操作的集合,不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败

注意:
mysql的事务是自动提交的,当执行一条语句,mysql会立即隐式的提交事务

事务控制:
开启事务:start transaction; /begin;
提交事务:commit;
回滚事务:rollback;

事务没提交,执行结果已经生效,但是只有提交其他事务才能知道你删除成功了

事务的四大特性(ACID)

原子性:事务是不可分割的最小单元,要么全部成功,要么全部失败
一致性:事务完成时,必须使所有数据都保持一致状态
隔离性:数据库提供的隔离机制,保证事务在不受外部并发操作影响的独立环境运行
持久性:事务一旦提交或者回滚,他对数据库中数据的改变是永久的

索引

create index 索引名 on 表(字段);

帮助数据库高效获取数据的数据结构(B+树)

优点:
提高数据库查询效率,降低数据库IO成本
通过索引列对数据进行排序,降低数据排序的成本,降低CPU消耗

缺点:
索引会占用存储空间
提高查询效率,降低增、删、改效率

索引结构(B+数):
每一个节点有多个key
所有节点存储在叶子结点,飞叶子结点仅用于索引数据
叶子结点形成一颗双向链表,便于数据的排序及区间范围查询

B+树详解

主键字段,在建表时,会自动创建主键索引
声明 UNIQUE 后,数据库自动创建唯一索引,是为了用高效的数据结构保证数据唯一性和加快查找。

语法:

创建索引:
create [unique] index 索引名 on 表名(字段名,、、、);

查看索引:
show index from 表名;

删除索引:
drop index 索引名 on 表名;

Mybatis

优秀的持久层(DAO层)框架,简化JDBC(操作数据库规范)开发

入门

1、准备工作:创建springboot工程、数据库表user、实体类User)
2、引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)
注意: 不要加分号

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接URL
spring.datasource.url=jbdc:mysql://localhost:3306/mybatis
#连接数据库用户名
spring.datasource.username=root
#连接数据库密码
spring.datasource.password=zhao521--

3、编写SQL语句(注解/XML)

JDBC

java语言操作关系型数据库的一套API
只是一套接口,具体实现由厂商提供(驱动)

步骤:
1、注册驱动
2、获取对象
3、获取执行SQL的对象statement,执行SQL,返回结果
4、封装结果
5、释放资源

问题:
1、获取的对象容易改变(硬编码不易修改)
2、封装结果臃肿
3、频繁获取、释放连接性能差

解决:
1、连接配置在Properties文件中
2、自动解析封装结果
3、数据库连接池管理(类似线程池)

程序员只需要定义:
properties配置
定义Mapper标签修饰的接口

数据库连接池

1、连接池是个容器,负责分配、管理数据库连接
2、它允许应用程序重复使用一个现有的数据库连接,而不是再建立一个
3、释放空闲时间超过最大空闲时间的连接,来避免因为没有释放资源连接而引起的数据库连接遗漏

优势:
资源重用
提升系统响应速度
避免数据库连接遗漏

实现:
标准接口:DataSource
由第三方实现
功能:获取连接 Connection getConnection()
使用最多的连接池技术:Druid(阿里巴巴开源)、Hikari(默认连接池)

lombok

lombok是一个实用的java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率。

注解:
@Data
提供了更综合的生成代码功能(@Getter、@Setter、@ToString、@EqualsAndHashCode)

@NoArgsConstructor
为实体生成无参构造器方法

@AllArgsConstructor
为实体生成除了static修饰的字段之外带有各参数的构造器方法

基础增删改查

动态SQL

资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 HttpServletRequestWrapper 是 Java Servlet API 中的一个工具类,位于 javax.servlet.http 包中,用于对 HttpServletRequest 对象进行封装,从而在 Web 应用中实现对 HTTP 请求的拦截、修改或增强等功能。通过继承该类并覆盖相关方法,开发者可以轻松地自定义请求处理逻辑,例如修改请求参数、添加请求头、记录日志等。 参数过滤:在请求到达处理器之前,可以对请求参数进行检查或修改,例如去除 URL 编码、过滤敏感信息或进行安全检查。 请求头操作:可以修改或添加请求头,比如设置自定义的 Content-Type 或添加认证信息。 请求属性扩展:在原始请求的基础上添加自定义属性,供后续处理使用。 日志记录:在处理请求前记录请求信息,如 URL、参数、请求头等,便于调试和监控。 跨域支持:通过添加 CORS 相关的响应头,允许来自不同源的请求。 HttpServletRequestWrapper 通过继承 HttpServletRequest 接口并重写其方法来实现功能。开发者可以在重写的方法中添加自定义逻辑,例如在获取参数时进行过滤,或在读取请求体时进行解密。当调用这些方法时,实际上是调用了包装器中的方法,从而实现了对原始请求的修改或增强。 以下是一个简单的示例,展示如何创建一个用于过滤请求参数的包装器: 在 doFilter 方法中,可以使用 CustomRequestWrapper 包装原始请求: 这样,每当调用 getParameterValues 方法时,都会先经过自定义的过滤逻辑。 HttpServletRequestWrapper 是 Java Web 开发中一个强大的工具,它提供了灵活的扩展性,允许开发者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值