【javaweb】学习日记Day8 - Mybatis入门 Mysql 多表查询 事务 索引

之前学习过的SQL语句笔记总结戳这里→【数据库原理与应用 - 第六章】T-SQL 在SQL Server的使用_Roye_ack的博客-CSDN博客

【数据库原理与应用 - 第八章】数据库的事务管理与并发控制_一级封锁协议_Roye_ack的博客-CSDN博客

目录

一、多表查询

1、概述

(1)笛卡尔积

(2)查询分类

2、连接查询 

(1)内连接

① 隐式内连接

② 显示内连接

(2)外连接

① 左外连接

② 右外连接

3、子查询

(1)标量子查询 - 子查询返回的结果为单个值

(2)列子查询 - 子查询返回的结果是一列

(3)行子查询 - 子查询返回的结果是一行

(4)表子查询 - 子查询返回的结果是多行多列

4、案例

二、事务

 1、事务的四大特性

三、索引

四、Mybatis

1、入门

(1)准备工作 

(2)配置Mybatis

(3)定义mapper接口

(4)定义测试类

2、JDBC介绍

3、数据库连接池

(1)定义 

(2)优势

(3)接口 

4、lombook


一、多表查询

1、概述

(1)笛卡尔积

两个集合A B的所有组合情况

【javaweb】学习日记Day8 - Mybatis入门 Mysql 多表查询 事务 索引_第1张图片

select * from tb_emp,tb_dept;

(2)查询分类

  • 1、连接查询
    • 内连接:相当于A,B交集部分
    • 外连接
      • 左外连接:查询左表的所有数据(包括AB交集部分)
      • 右外连接:查询右表的所有数据(包括AB交集部分)
      • 【javaweb】学习日记Day8 - Mybatis入门 Mysql 多表查询 事务 索引_第2张图片

  • 2、子查询 

2、连接查询 

(1)内连接

① 隐式内连接

-- A. 查询员工的姓名 , 及所属的部门名称 (隐式内连接实现)
select tb_emp.name, tb_dept.name
from tb_dept,
     tb_emp
where tb_dept.id = tb_emp.dept_id;
-- 起别名
select e.name, d.name
from tb_emp e,
     tb_dept d
where e.dept_id = d.id;

② 显示内连接

-- B. 查询员工的姓名 , 及所属的部门名称 (显式内连接实现)
select tb_emp.name, tb_dept.name
from tb_dept inner join tb_emp on tb_dept.id = tb_emp.dept_id;

(2)外连接

① 左外连接

【javaweb】学习日记Day8 - Mybatis入门 Mysql 多表查询 事务 索引_第3张图片

-- A. 查询员工表 所有 员工的姓名, 和对应的部门名称 (左外连接)
select e.name, d.name
from tb_emp e
         left join tb_dept d on e.dept_id = d.id;

② 右外连接

【javaweb】学习日记Day8 - Mybatis入门 Mysql 多表查询 事务 索引_第4张图片

-- B. 查询部门表 所有 部门的名称, 和对应的员工名称 (右外连接)
select e.name,d.name
from tb_emp e
         right join tb_dept d on e.dept_id = d.id;

3、子查询

(1)标量子查询 - 子查询返回的结果为单个值

-- 标量子查询
-- A. 查询 "教研部" 的所有员工信息
select *
from tb_emp
where dept_id = (select id
                 from tb_dept
                 where name = '教研部');

-- B. 查询在 "方东白" 入职之后的员工信息
select *
from tb_emp A
where A.entrydate > (select B.entrydate
                     from tb_emp B
                     where B.name = '方东白');

(2)列子查询 - 子查询返回的结果是一列

innot in

-- A. 查询 "教研部" 和 "咨询部" 的所有员工信息
select *
from tb_emp
where dept_id in (select id
                 from tb_dept
                 where name in ('教研部', '咨询部'));

(3)行子查询 - 子查询返回的结果是一行

-- A. 查询与 "韦一笑" 的入职日期 及 职位都相同的员工信息 ;
select *
from tb_emp
where (entrydate, job) in (select entrydate, job
                           from tb_emp
                           where name = '韦一笑')

(4)表子查询 - 子查询返回的结果是多行多列

-- A. 查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门名称
select t.*, d.name
from (select * from tb_emp where entrydate > '2016-01-01') t,
     tb_dept d
where t.dept_id = d.id;

4、案例

【javaweb】学习日记Day8 - Mybatis入门 Mysql 多表查询 事务 索引_第5张图片

-- 1. 查询价格低于 10元 的菜品的名称 、价格 及其 菜品的分类名称 .
select dish.name, price, category.name
from dish
         inner join category on dish.category_id = category.id
where price < 10;


-- 2. 查询所有价格在 10元(含)到50元(含)之间 且 状态为'起售'的菜品名称、价格 及其 菜品的分类名称 (即使菜品没有分类 , 也需要将菜品查询出来).
select dish.name, price, category.name
from dish
         left join category on dish.category_id = category.id
where price between 10 and 50
  and dish.status = 1;


-- 3. 查询每个分类下最贵的菜品, 展示出分类的名称、最贵的菜品的价格 .
select category.name, max(price)
from dish
         inner join category on dish.category_id = category.id
group by category.id;


-- 4. 查询各个分类下 状态为 '起售' , 并且 该分类下菜品总数量大于等于3 的 分类名称 .
select category.name
from dish
         inner join category on dish.category_id = category.id
where dish.status = 1
group by category.id
having count(*) >= 3;


-- 5. 查询出 "商务套餐A" 中包含了哪些菜品 (展示出套餐名称、价格, 包含的菜品名称、价格、份数).
select s.name, s.price, d.name, d.price, sd.copies
from dish d,
     setmeal s,
     setmeal_dish sd
where d.id = sd.dish_id
  and s.id = sd.setmeal_id
  and s.name = '商务套餐A'


-- 6. 查询出低于菜品平均价格的菜品信息 (展示出菜品名称、菜品价格).
select name, price
from dish
where price < (select avg(price)
               from dish)

二、事务

Day08-08. MySQL-事务-介绍与操作_哔哩哔哩_bilibili

事务是一组操作的集合,这些操作要么同时成功,要么同时失败

-- 开启事务
start transaction ;

-- 删除部门
delete from tb_dept where id = 2;

-- 删除部门下的员工
delete from tb_emp where dept_id = 2;

-- 提交事务
commit;

-- 回滚事务
rollback ;

 1、事务的四大特性

  •  原子性:事务中一系列操作是不可再分的工作单位
  • ② 一致性:事务执行的结果必须使数据库从一个一致性状态变到另一个一致性状态
  •  隔离性:一个事务的执行不能被其他事务所干扰
  • ④ 持续性:一个事务一旦提交,该事务的操作结果永久有效

三、索引

索引是帮助数据库高效获取数据的数据结构

数据结构:B+树

【javaweb】学习日记Day8 - Mybatis入门 Mysql 多表查询 事务 索引_第6张图片

 【javaweb】学习日记Day8 - Mybatis入门 Mysql 多表查询 事务 索引_第7张图片

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

-- 查看索引
show index from 表名;

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

四、Mybatis

解决在idea中构建项目出现不能创建java类,只能创建文件的问题~_从未止步..的博客-CSDN博客

1、入门

【javaweb】学习日记Day8 - Mybatis入门 Mysql 多表查询 事务 索引_第8张图片

(1)准备工作 

【javaweb】学习日记Day8 - Mybatis入门 Mysql 多表查询 事务 索引_第9张图片

 【javaweb】学习日记Day8 - Mybatis入门 Mysql 多表查询 事务 索引_第10张图片

 (2)配置Mybatis

【javaweb】学习日记Day8 - Mybatis入门 Mysql 多表查询 事务 索引_第11张图片

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

 (3)定义mapper接口

【javaweb】学习日记Day8 - Mybatis入门 Mysql 多表查询 事务 索引_第12张图片

@Mapper //运行时会自动生成该接口的实现类对象(代理对象),并将该对象交给IOC容器管理
public interface Usermapper {
    //查询全部用户信息
    @Select("select * from user")
    public List list();
}

(4)定义测试类

@SpringBootTest
class MybatisApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testusermapper() {
        List  userList = userMapper.list();
        userList.stream().forEach(user -> {
            System.out.println(user);
        });
    }
}

【javaweb】学习日记Day8 - Mybatis入门 Mysql 多表查询 事务 索引_第13张图片

2、JDBC介绍

一套操作关系型数据库的API

SpringBoot+Mybatis 完胜 JDBC

【javaweb】学习日记Day8 - Mybatis入门 Mysql 多表查询 事务 索引_第14张图片

3、数据库连接池

(1)定义 

  • 数据库连接池是个容器,负责分配管理数据库连接
  • 允许应用程序重复使用一个现有的数据库连接,不用重新建立
  • 释放【空闲时间 > 最大空闲时间】的连接,避免因为没有释放连接而引起的数据库连接遗漏

(2)优势

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

(3)接口 

切换Druid连接池:在pom.xml文件中添加依赖


   com.alibaba
   druid-spring-boot-starter
   1.2.8

【javaweb】学习日记Day8 - Mybatis入门 Mysql 多表查询 事务 索引_第15张图片

4、lombook

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

注解 作用
@Getterl / @Setter 为所有的属性提供 get/set 方法
@Tostring 会给类自动生成易阅读的toString方法
@EqualsAndHashCode 根据类所拥有的非静态字段自动重写equals方法和 hashcode方法
@Data 提供了更综合的生成代码功能(@Getter +@Setter +@ToString +@EqualsAndHashcode)
@NoArgsConstructor 为实体类生成无参构造器方法
@AllArgsConstructor 为实体类生成除了static修饰的字段之外带有各参数的构造器方法
import lombok.Data;

@Data
public class user {
    private Integer id;
    private String name;
    private Short age;
    private Short gender;
    private String phone;
}

你可能感兴趣的:(Javaweb,数据库,学习,mysql,mybatis,事务,后端,javaweb)