JavaWeb学习笔记——第八天

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(多路平衡搜索树)

B+Tree
  • 每一个节点,可以存储多个key(有n个key,就有n个指针),因此树的层数较浅,查找较快。
  • 所有的数据都存储在叶子节点,非叶子节点仅用于索引数据。
  • 叶子节点形成了一颗双向链表,便于数据的排序及区间范围查询。
  • 在查询数据时,首先将要查询的数据的键值在根节点进行二分查找,并根据查找结果进入下一层节点;在第二层节点中又进行二分查找,并根据查找结果进如下一层……重复这个过程直到进入叶子结点,最后在叶子节点中进行顺序查找,就找到了目标索引并取得对应的值。

语法

  • 创建索引
create [ unique ] index 索引名 on 表名 (字段名,... ); -- 加上unique即为创建唯一索引,也即添加唯一约束
  • 查看索引
show index from 表名;
  • 删除索引
drop index 索引名 on 表名;

注意事项

  • 主键字段,在建表时,会自动创建主键索引,且主键索引的效率是最高的。
  • 添加唯一约束时,本质上就是添加了一个唯一索引。

Mybatis(一)

  • MyBatis是一款优秀的持久层框架,用于简化JDBC的开发。
  • MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
  • 官网:https://mybatis.org/mybatis-3/zh/index.html

Mybatis入门

Mybatis使用步骤(以查询为例)

一、准备工作

  1. 创建springboot工程。
  2. 创建数据库表(例子:user)。
  3. 创建实体类(例子: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数据库连接池

<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自带)。

posted @ 2024-03-29 14:34  zgg1h  阅读(43)  评论(0)    收藏  举报