MySQL(三)
多表查询
- 多表查询指从多张表中查询数据。
- 可以直接使用指令
select * from 表1, 表2;
来同时查询表1和表2的数据,但此时会出现笛卡尔积的情况。 - 笛卡尔乘积是指在数学中,两个集合(A集合 和 B集合)的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)
- 使用指令
select * from 表1, 表2 where 表1.外键名 = 表2.id;
即可消除无效的笛卡尔积。
多表查询的分类
- 连接查询:
- 内连接:相当于查询A、B交集部分数据。
- 外连接:
- 左外连接:查询左表所有数据(包括两张表交集部分数据)。
- 右外连接:查询右表所有数据(包括两张表交集部分数据)。
- 子查询。
内连接
- 隐式内连接:
select 字段列表 from 表1, 表2 where 条件 ... ;
- 显式内连接:
select 字段列表 from 表1 [ inner ] join 表2 on 连接条件 ... ;
注意事项
- 在字段列表中,如果要指定两张表中相同名称的字段,则必须使用
表名.字段名
来指定。 - 可以在from后的表明后指定表的别名,之后在指定字段名时就必须使用
表的别名.字段名
来指定。
外连接
- 左外连接:
select 字段列表 from 表1 left [ outer ] join 表2 on 连接条件 ... ;
- 右外连接:
select 字段列表 from 表1 right [ outer ] join 表2 on 连接条件 ... ;
子查询
- SQL语句中嵌套select语句,称为嵌套查询,又称子查询。
- 形式:
select * from t1 where column1 = ( select column1 from t2 … );
- 子查询外部的语句可以是insert / update / delete / select 的任何一个,最常见的是 select。
子查询的分类
类型 | 说明 | 常用的操作符 |
---|---|---|
标量子查询 | 子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式 | =、<>、>、>=、<、<= |
列子查询 | 子查询返回的结果是一列(可以是多行) | in、not in等 |
行子查询 | 子查询返回的结果是一行(可以是多列) | = 、<> 、in 、not in |
表子查询 | 子查询返回的结果是多行多列,常作为临时表使用 | in |
- 由于子查询需要进行多次查询,所以效率较低,应尽量使用连接查询。
事务
- 事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作 要么同时成功,要么同时失败。
- 默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句时,MySQL会立即隐式的提交事务。
事务控制语法
操作 | 语法 |
---|---|
开启事务 | start transaction; 或 begin; |
提交事务 | commit; |
回滚事务 | rollback; |
事务的四大特性(ACID)
特性 | 说明 |
---|---|
原子性(Atomicity) | 事务是不可分割的最小单元,要么全部成功,要么全部失败 |
一致性(Consistency) | 事务完成时,必须使所有的数据都保持一致状态 |
隔离性(Isolation) | 数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行 |
持久性(Durability) | 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的 |
索引
概述
- 索引(index)是帮助数据库高效获取数据的数据结构。
- 在没有建立索引时,数据库在查找时会进行全表扫描,效率非常低。
- 建立索引之后,数据库会在特殊的数据结构中进行查找,这大大提高了查找效率。
优缺点
优点 | 缺点 |
---|---|
提高数据查询的效率,降低数据库的IO成本 | 索引会占用存储空间 |
通过索引列对数据进行排序,降低数据排序的成本,降低CPU消耗 | 索引大大提高了查询效率,同时却也降低了insert、update、delete的效率 |
数据结构
MySQL数据库支持的索引结构有很多,如:Hash索引、B+Tree索引、Full-Text索引等。我们平常所说的索引,如果没有特别指明,都是指默认的 B+Tree 结构组织的索引。
B+Tree(多路平衡搜索树)
- 每一个节点,可以存储多个key(有n个key,就有n个指针),因此树的层数较浅,查找较快。
- 所有的数据都存储在叶子节点,非叶子节点仅用于索引数据。
- 叶子节点形成了一颗双向链表,便于数据的排序及区间范围查询。
- 在查询数据时,首先将要查询的数据的键值在根节点进行二分查找,并根据查找结果进入下一层节点;在第二层节点中又进行二分查找,并根据查找结果进如下一层……重复这个过程直到进入叶子结点,最后在叶子节点中进行顺序查找,就找到了目标索引并取得对应的值。
语法
- 创建索引
create [ unique ] index 索引名 on 表名 (字段名,... ); -- 加上unique即为创建唯一索引,也即添加唯一约束
- 查看索引
show index from 表名;
- 删除索引
show index from 表名;
注意事项
- 主键字段,在建表时,会自动创建主键索引,且主键索引的效率是最高的。
- 添加唯一约束时,本质上就是添加了一个唯一索引。
Mybatis(一)
- MyBatis是一款优秀的持久层框架,用于简化JDBC的开发。
- MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
- 官网:https://mybatis.org/mybatis-3/zh/index.html
Mybatis入门
Mybatis使用步骤(以查询为例)
一、准备工作
- 创建springboot工程。
- 创建数据库表(例子:user)。
- 创建实体类(例子:User):实体类的属性名要和数据库表的字段名一一对应(使用下划线的字段名要更换成使用驼峰体的属性名)。
二、引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)
- 数据库连接信息(在application.properties文件中编辑四要素):
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/表名
#连接数据库的用户名
spring.datasource.username=用户名
#连接数据库的密码
spring.datasource.password=密码
三、编写SQL语句(注解/XML)
@Mapper //Mapper注解的作用:在运行时,会自动生成该接口的实现类对象(代理对象),并且将该对象交给IOC容器管理
public interface UserMapper {
@Select("select * from user") //注解名为DML操作名,括号里写SQL语句
public List<User> list();
}
四、单元测试
- 在Test目录下自动生成的springboot整合单元测试的文件中编写代码:
@SpringBootTest //springboot整合单元测试的注解
class SpringbootMybatisQuickstart1ApplicationTests {
@Autowired //通过依赖注入将userMapper对象注入进来
private UserMapper userMapper;
@Test
public void test1(){
List<User> userList = userMapper.list();
userList.stream().forEach(user -> System.out.println(user));
}
}
补充:配置SQL提示
- 默认在mybatis中编写的SQL语句是不识别的。可以做如下配置:选中SQL语句→点击右键→Show Context Actions→Inject language or reference→MySQL(SQL)。
- 若IDEA和数据库没有建立连接,则不能识别表的信息(表明,表的字段等)。解决方式:在IDEA中配置MySQL数据库连接时加上Database。
JDBC
- JDBC( Java DataBase Connectivity )就是使用Java语言操作关系型数据库的一套API。
JDBC的本质
- sun公司官方定义的一套操作所有关系型数据库的规范,即接口。
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包。
- 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
JDBC的缺点
- 配置信息使用硬编码,不利于修改和维护。
- 代码繁琐。
- 频繁地获取和释放连接资源,导致资源浪费和性能降低。
数据库连接池
- 数据库连接池是个容器,负责分配、管理数据库连接(Connection)。
- 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。
- 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏。
优势
- 资源重用。
- 提升系统响应速度。
- 避免数据库连接遗漏。
标准接口:DataSource
- 官方(sun)提供的数据库连接池接口,由第三方组织实现此接口。
- 功能:获取连接 。
常见产品
C3P0、DBCP、Druid、Hikari(springboot默认)。
切换Druid数据库连接池
- 官方地址:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
- 只需要在pom.xml中引入依赖即可:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
lombok
- lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率。
- 需要引入依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
- 常用注解:
注解 | 作用 |
---|---|
@Getter/@Setter | 为所有的属性提供get/set方法 |
@ToString | 会给类自动生成易阅读的 toString 方法 |
@EqualsAndHashCode | 根据类所拥有的非静态字段自动重写 equals 方法和 hashCode 方法 |
@Data | 提供了更综合的生成代码功能(@Getter + @Setter + @ToString + @EqualsAndHashCode) |
@NoArgsConstructor | 为实体类生成无参的构造器方法 |
@AllArgsConstructor | 为实体类生成除了static修饰的字段之外带有各参数的构造器方法 |
lombok的原理
lombok会在编译时,自动生成对应的java代码。
注意事项
我们使用lombok时,还需要安装一个lombok的插件(IDEA自带)。
标签:事务,JavaWeb,第八天,数据库,笔记,查询,索引,连接,select From: https://www.cnblogs.com/zgg1h/p/18103806