1 多表查询
笛卡尔积:在数学中,两个集合(A集合 和 B集合)的所有组合情况
在多表查询时,需要消除无效的笛卡尔积
select * from tb_emp,tb_dept where dept_id = tb_dept.id;
多表查询分为:
- 连接查询
内连接:相当于查询A、B交集部分数据
外连接:
1)左外连接:查询左表所有数据(包括两张表交集部分数据)
2)右外链接:查询右表所有数据(包括两张表交集部分数据)
- 子查询
1.1 内连接
- 隐式内连接
select 字段列表 from 表1, 表2 where 条件...;
- 显式内连接
select 字段列表 from 表1 [inner] join 表2 on 链接条件...;
1.2 外连接
- 左外连接
select 字段列表 from 表1 left [outer] join 表2 on 链接条件;
- 右外链接
select 字段列表 from 表1 right [outer] join 表2 on 链接条件;
1.3 子查询
子查询(嵌套查询):SQL 语句中嵌套 select 语句
select * from t1 where column1 = (select column1 from t2...)
分类
- 标量子查询:子查询返回的结果为单个值
- 列子查询:子查询返回的结果为一列
- 行子查询:子查询返回的结果为一行
- 表子查询:子查询返回的结果为多行多列
标量子查询:
列子查询
行子查询
表子查询
2 事务
背景:员工属于部门,当某个部门删除,员工也要删除,如果员工在删除时,失败,此时出现表结构不一致
事务:是一组操作的集合,它是一个不可分割的工作单位
事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败
注:默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务
MySQL 的事务控制:
- 开启事务:start transaction; / begin;
- 提交事务:commit;
- 回滚事务:rollback;
2.1 事务的四大特性
3 索引
索引(index)是帮助数据库高效获取数据的数据结构
优点:
- 提高数据查询的效率,降低数据库的 IO 成本
- 通过索引列对数据进行排序,降低数据排序的成本,降低 CPU 消耗
缺点:
- 索引会占用存储空间
- 索引大大提高了查询效率,同时却也降低了 insert、update、delete 的效率
结构
创建索引
create [unique] index 索引名 on 表名(字段名,...);
查看索引
show index from 表名;
删除索引
drop index 索引名 on 表名;
4 Mybatis
MyBatis 是一款优秀的 持久层 框架,用于简化 JDBC 的开发
官网:MyBatis中文网
4.1 Mybatis 入门程序
第一步
创建 springboot 工程,User 表(在 pojo 里面),数据库表 mybatis
第二步
配置数据库的链接信息,注意,数据库的名字 mybatis
配置四要素
第三步
单元测试:
4.2 配置 SQL 提示
但是此时 user 识别不出来,原因是 IDEA 没有与数据库建立链接
建立链接:
4.3 JDBC
JDBC(JavaDataBase Connectivity),使用 Java 语言操作关系型数据库的 API
- sun公司官方定义的一套操作所有关系型数据库的规范,即接口
- 各个数据库厂商去实现这套接口,提供数据库驱动 jar 包
- 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动 jar 包中的实现类
↓
4.4 数据库连接池
- 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
- 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
- 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏
优点:
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
官方(sun 公司)提供的数据库连接池接口,由第三方组织实现此接口
功能:获取链接
常见产品:
- C3P0
- DBCP
- Druid(阿里巴巴)
- Hikari(springboot 默认)
切换连接池:
4.5 Lombok
之前的 User 类代码太多
使用 lombok
Lombok 是一个实用的 Java 类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、tostring等方法,并可以自动化生成日志变量,简化 Java 开发、提高效率
注解 | 作用 |
---|---|
@Getter/Setter | 为所有属性提供 get/set 方法 |
@ToString | 给类生成 toString 方法 |
@EqualsAndHashCode | 根据类所拥有的非静态字段自动重写 equals 方法和 hashCode 方法 |
@Data | 提供了更综合的生成代码功能 (@Getter + @Setter + @ToString + @EqualsAndHashCode) |
@NoArgsConstructor | 为实体类生成无参构造器方法 |
@AllArgsConstructor | 为实体类生成除了 static 修饰的字段之外带有各参数的构造器方法 |
添加 lombok 依赖:
然后在 User 里面
@Data // @Getter + @Setter + @ToString + @EqualsAndHashCode
@NoArgsConstructor // 无参构造
@AllArgsConstructor // 有参构造
public class User {private Integer id;private String name;private Short age;private Short gender;private String phone;
}