黑马2023javaweb(08)|MySQL(多表查询,事务,索引),mybatis入门(简化JDBC开发)

IDEA快捷键:

向后缩进:选择好代码,按【TAB】

向前缩进:选择好代码,按【shift】+【TAB】

目录

一:MySQL

(一)多表查询

1.内连接--查两张表的交集

2.外连接

3.内连接与外连接的区别

4.子查询--嵌套查询

(1)标量子查询--子查询返回单个值

(2)列子查询--子查询返回结果为一列(属性字段值)

--  两个select语句合在一起

select * from tb_emp where dept_id in (select id from tb_dept where name = '教研部' or name = '咨询部');

(3)行在查询--子查询返回结果为一行(行记录)

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

5.案例

(二)事务

1.介绍

2.操作

3.事务特性

4.小结

(三)索引

1.介绍

2.结构

3.语法

二:mybatis入门--简化JDBC开发

(一)快速入门

1.案例介绍

2.实现过程

3.配置SQL提示

(二)JDBC介绍

(三)数据库连接池

1.介绍

2.创建数据库连接池

3.更换默认连接池接口

(1)方法一:加依赖

(2)方法二:配置文件中指明

(四)lombok

1.问题--代码臃肿

2.lombok提供的注解

3.举例

(1)首先pox文件中添加lombok

(2)添加注解


一:MySQL

(一)多表查询

73ba4ea5b6ef45aaa6f96600fdccb9f9.pngbc97b70950664e7ea165dcbc1801c40a.png

7d96d5f87e054bca81f8a043ce77316c.png

1.内连接--查两张表的交集

注意这个起别名操作

-- ============================= 内连接 ==========================
-- A. 查询员工的姓名 , 及所属的部门名称 (隐式内连接实现)
select tb_emp.name,tb_dept.name from tb_emp,tb_dept where tb_emp.dept_id = tb_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_emp  join tb_dept on tb_emp.dept_id =

tb_dept.id;

注意:一共17条数据,只查出来16条数据,因为有一条数据的归属部门为null,没有与部门表建立联系,不属于二者的交集,没有被查出来

2.外连接

61657fefbc1c49a491ff8013e6191c85.png

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

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

-- 起别名

select e.name, d.name from tb_dept d left join tb_emp e on e.dept_id = d.id;
 

相比内连接:查出来了17号数据

56ed6e3cb7754b018aedd5e639d730f9.png

相比内连接:查出来了18条数据,16条关联数据,2条无关联数据

人事部, 就业部

a85dd076436f4d67b0adccea2559e3a4.png

48d9b0877c38495b92be40c6ca98d10e.png

3.内连接与外连接的区别

看上面的例子

4.子查询--嵌套查询

重点看例题

9b32146f7f6b443eabd4a62c04c5a38e.png

(1)标量子查询--子查询返回单个值

3719b8d5479c47d7bc46991981509bb2.png

举例:

-- 标量子查询
-- A. 查询 "教研部" 的所有员工信息
-- a. 查询 教研部 的部门ID - tb_dept
select id from tb_dept where name = '教研部';  -- 2

-- b. 再查询该部门ID下的员工信息 - tb_emp

select * from tb_emp where dept_id =2;

--  两个select语句合在一起
select * from tb_emp where dept_id = (select id from tb_dept where name = '教研部');

-- B. 查询在 "方东白" 入职之后的员工信息
-- a. 查询 方东白 的入职时间
select entrydate from tb_emp where name = '方东白';  -- 2012-11-01

-- b. 查询在 "方东白" 入职之后的员工信息

select * from tb_emp where entrydate >2012-11-01;

--  两个select语句合在一起
select * from tb_emp where entrydate > (select entrydate from tb_emp where name = '方东白');

(2)列子查询--子查询返回结果为一列(属性字段值)

e84417efd1f44e479c40353cd751a37d.png

举例:

-- 列子查询
-- A. 查询 "教研部" 和 "咨询部" 的所有员工信息
-- a. 查询 "教研部" 和 "咨询部" 的部门ID - tb_dept
select id from tb_dept where name = '教研部' or name = '咨询部';  -- (2,3)

2ec04d7e83644d90a4982cf8fafd5267.png

-- b. 根据部门ID, 查询该部门下的员工信息 - tb_emp
select * from tb_emp where dept_id in (2,3);

--  两个select语句合在一起

select * from tb_emp where dept_id in (select id from tb_dept where name = '教研部' or name = '咨询部');

(3)行在查询--子查询返回结果为一行(行记录)

847618c168c843e29da4d80ea34ee156.png

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

-- b. 查询与其入职日期 及 职位都相同的员工信息 ;
-- 方式一
select * from tb_emp where entrydate = (select entrydate from tb_emp where name = '韦一笑') and job = (select job from tb_emp where name = '韦一笑');

select * from tb_emp where entrydate = '2007-01-01' and job=2;

等价于: select * from tb_emp where (entrydate,job)=( '2007-01-01', 2)

-- 方式二
select * from tb_emp where (entrydate,job)=(select entrydate,job from tb_emp where name = '韦一笑');
 

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

在子表中查询,子表跟在from后面

61b1195284ea402e89b7e182b5b0c1d6.png

-- 表子查询
-- A. 查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门名称
-- a. 查询入职日期是 "2006-01-01" 之后的员工信息
select * from tb_emp where entrydate > '2006-01-01';

-- b. 查询这部分员工信息及其部门名称 - tb_dept
select e.* , d.name from (select * from tb_emp where entrydate > '2006-01-01') e , tb_dept d where e.dept_id = d.id;

5.案例

62338019887f482db07c1a39710b3581.png

63b0ecbad9c04842a93bdca84d40e036.png

(1)查询价格低于 10元 的菜品的名称 、价格 及其 菜品的分类名称

方式一:用表子查询

step1:查询价格低于 10元菜品的名称 、价格 及其 菜品的分类id---返回结果为表

step2:查询分类id对应的分类名称--两张表里查,使用外连接

方法二:直接两张表一块查--内连接(用外连接也行)

select d.name, d.price, c.name
from dish d,
     category c
where d.category_id = c.id
  and d.price < 10;

(2)查询所有价格在 10元(含)到50元(含)之间 且 状态为'起售'的菜品, 展示出菜品的名称、价格 及其 菜品的分类名称 (即使菜品没有分类 , 也需要将菜品查询出来).

---外连接,两个条件,两张表

select d.name, d.price, c.name
from dish d
         left join category c on d.category_id = c.id
where d.price between 10 and 50
  and d.status = 1;

(3)查询每个分类下最贵的菜品, 展示出分类的名称、最贵的菜品的价格--重点看

方法一:列子查询+group  by 分组 ----难点

step1: 子查询--先分组(按菜品分类),得到每个分类下的最贵菜品的价格p

select max(菜品表.菜品价格) from 菜品表 group by 菜品分类 id   --result

step2:再筛选每组内价格等于p的菜品

select 分类表.菜品分类名 菜品表.菜品价格 from 分类表 菜品表  where 菜品表.菜品价格 in (result)

方法二:

执行顺序: from --> where  --> group by --> select

先分组了,然后选择   max(d.price)  这个是分组后的

通过c.name 两张表都分组了

分组了的表,只能返回分组字段和聚合函数

select c.name, max(d.price)
from dish d,
     category c
where d.category_id = c.id
group by c.name;

87e4fb5424254d708b7099d4ce641c16.png

0414187009834c2c8a699349330283ac.png

(4)查询各个分类下 菜品状态为 '起售' , 并且 该分类下菜品总数量大于等于3 的 分类名称 .

首先筛选出 菜品状态为 '起售'的菜品--where  + 内连接

select 分类表.名称 from 分类表 菜品表 where 菜品表.菜品状态==起售   (漏了两张表要连一起)

然后group by + count聚合函数

group by 分类表.名称 

having count(菜品表.菜品名称)>=3

select c.name, count(*)
from dish d,
     category c
where d.category_id = c.id
  and d.status = 1
group by c.name
having count(*) >= 3;

(5)查询出 "商务套餐A"包含了哪些菜品 (展示出套餐名称、价格, 包含的菜品名称、价格、份数).--- 多对多查询

f927248568184a51beca393972413be0.png

然后再把*换回需要返回的字段名

s.name, s.price, d.name, d.price, sd.copies,

(份数在中间表中)

-- 表: setmeal , setmeal_dish , dish
-- SQL:
select s.name, s.price, d.name, d.price, sd.copies
from setmeal s,
     setmeal_dish sd,
     dish d
where s.id = sd.setmeal_id
  and sd.dish_id = d.id

  and s.name = '商务套餐A';

(6)查询出低于菜品平均价格的菜品信息 (展示出菜品名称、菜品价格).

-- a. 计算 菜品平均价格
select avg(price) from dish;

-- b. 查询出低于菜品平均价格的菜品信息
select * from dish where price < (select avg(price) from dish);

(二)事务

ee2b4d16f03548a685f24b9472fc7808.png

1.介绍

54510a16ef8040bc80201ee711a90ef1.png

2.操作

604b176d27384e6781f2f19cbb9e24cb.png

举例:

c6f67b0ed24e4a38abe633b9dcbe6f8d.png

2be9cd910a504ebfa9229a5607d138e9.png

3.事务特性

25e9de575ea044e5ba5f41cbed8f376f.png

4.小结

7551afd40701458f92caba0a1e12cca6.png

(三)索引

【Java Web】008 - MySQL(多表查询 & 事务 & 索引)_java mysql 事务-CSDN博客

索引提高查询速度(空间换时间)

c719e54bec59476e915b3ecb5f83d2f1.png

举例:

930965e7015043b9a66af569aeab4dab.png

数据量越大,查询效率越低,那么我们就要对其进行优化,从而提高它查询效率,这时候就用到了索引

1274bf6b08914d13bd1fe8b6af9f4506.png

1.介绍

索引:提高查询数据的数据结构

34f6808892de4322b71a0036b6cd3c77.png

951f9625ea4f4f1b8b5b192ad55553fd.png

但是:一个业务,查询业务占90%以上,这两个缺点就不值一提了

2.结构

cffe0a8d16914d4da3258907c1aadf70.png

f52013935b46481a87287e73395b3458.png

3.语法

a3ada638a8084babad2d836d6e3055b7.png

举例;

f61fb3b0941c4d28a0c41c5c01bad377.png

二:mybatis入门--简化JDBC开发

6fcc3f2fa63844359f8944db6369063a.png

03cd29d7747340c0a92fc60b54fa5682.png

005066314e854fc08a456f0adaa43e50.png

(一)快速入门

1.案例介绍

676a9fccd0c94002ac3536356ff0f6d4.png

a9532e218bc9446395720a51ab6babec.png

2.实现过程

【Java Web】009 -- MyBatis(入门 & 增删改查 & 动态SQL)_mybatis新增sql-CSDN博客

Day08-14. Mybatis-入门-快速入门程序_哔哩哔哩_bilibili

d4d7f655edae45f491969e49a3d56665.png

springboot整合mybatis配置数据库,就是将上述操作转换为如下代码配置到application.properties文件中

6ea5cc9085954987a90b9442b120fd0b.png

d657271adfe74973a52991685baea4ba.png

09c6cfd7cf46453db566c3a179e0594a.png

0e4e2f52687b48dcac48341a2e4bca37.png

d6c8622bde9e4f85878246672735dd8b.png

3.配置SQL提示

注入SQL语言

配置数据库连接

(二)JDBC介绍

99784255f24c4214a31bd9a43f787fc2.png

7b6a06e681f4434fbc320cd789d9929d.png

资源浪费:资源指数据库连接资源 (图中的黄色部分),创建资源很麻烦,费时,频繁创建释放,程序运行慢

mybatis主要关注以下两点:

81f13cf2e3cc4cc6afbcfd5b77def5be.png

(三)数据库连接池

1.介绍

---- 类似线程池

9e7f75b65d3542be952833730187dd32.png

2.创建数据库连接池

eadec04656ff42eb85d8e34fed269fcd.png

4e455d23285e4cc4801b7a6b52af6b30.png

3.更换默认连接池接口

(1)方法一:加依赖

86df0c2b7daf4b6d9ddb3790450a9270.png

(2)方法二:配置文件中指明

75ef6ccf8fe44ab286d40b5a945c9f82.png

(四)lombok

1.问题--代码臃肿

4e715a92c5ad47449ede1a3bfb8bbeda.png

2.lombok提供的注解

7e7a37639c7a4ee18ce379cabdc4f025.png

3.举例

(1)首先pox文件中添加lombok

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

(2)添加注解

d37ad3bda0384f2d86e6e1f4914c91da.png

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值