• 【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的所有组合情况

    select * from tb_emp,tb_dept;

    (2)查询分类

    • 1、连接查询
      • 内连接:相当于A,B交集部分
      • 外连接
        • 左外连接:查询左表的所有数据(包括AB交集部分)
        • 右外连接:查询右表的所有数据(包括AB交集部分)

    • 2、子查询 

    2、连接查询 

    (1)内连接

    ① 隐式内连接
    1. -- A. 查询员工的姓名 , 及所属的部门名称 (隐式内连接实现)
    2. select tb_emp.name, tb_dept.name
    3. from tb_dept,
    4. tb_emp
    5. where tb_dept.id = tb_emp.dept_id;
    1. -- 起别名
    2. select e.name, d.name
    3. from tb_emp e,
    4. tb_dept d
    5. where e.dept_id = d.id;
    ② 显示内连接
    1. -- B. 查询员工的姓名 , 及所属的部门名称 (显式内连接实现)
    2. select tb_emp.name, tb_dept.name
    3. from tb_dept inner join tb_emp on tb_dept.id = tb_emp.dept_id;

    (2)外连接

    ① 左外连接

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

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

    3、子查询

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

    1. -- 标量子查询
    2. -- A. 查询 "教研部" 的所有员工信息
    3. select *
    4. from tb_emp
    5. where dept_id = (select id
    6. from tb_dept
    7. where name = '教研部');
    8. -- B. 查询在 "方东白" 入职之后的员工信息
    9. select *
    10. from tb_emp A
    11. where A.entrydate > (select B.entrydate
    12. from tb_emp B
    13. where B.name = '方东白');

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

    innot in

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

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

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

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

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

    4、案例

    1. -- 1. 查询价格低于 10元 的菜品的名称 、价格 及其 菜品的分类名称 .
    2. select dish.name, price, category.name
    3. from dish
    4. inner join category on dish.category_id = category.id
    5. where price < 10;
    6. -- 2. 查询所有价格在 10元(含)到50元(含)之间 且 状态为'起售'的菜品名称、价格 及其 菜品的分类名称 (即使菜品没有分类 , 也需要将菜品查询出来).
    7. select dish.name, price, category.name
    8. from dish
    9. left join category on dish.category_id = category.id
    10. where price between 10 and 50
    11. and dish.status = 1;
    12. -- 3. 查询每个分类下最贵的菜品, 展示出分类的名称、最贵的菜品的价格 .
    13. select category.name, max(price)
    14. from dish
    15. inner join category on dish.category_id = category.id
    16. group by category.id;
    17. -- 4. 查询各个分类下 状态为 '起售' , 并且 该分类下菜品总数量大于等于3 的 分类名称 .
    18. select category.name
    19. from dish
    20. inner join category on dish.category_id = category.id
    21. where dish.status = 1
    22. group by category.id
    23. having count(*) >= 3;
    24. -- 5. 查询出 "商务套餐A" 中包含了哪些菜品 (展示出套餐名称、价格, 包含的菜品名称、价格、份数).
    25. select s.name, s.price, d.name, d.price, sd.copies
    26. from dish d,
    27. setmeal s,
    28. setmeal_dish sd
    29. where d.id = sd.dish_id
    30. and s.id = sd.setmeal_id
    31. and s.name = '商务套餐A'
    32. -- 6. 查询出低于菜品平均价格的菜品信息 (展示出菜品名称、菜品价格).
    33. select name, price
    34. from dish
    35. where price < (select avg(price)
    36. from dish)

    二、事务

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

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

    1. -- 开启事务
    2. start transaction ;
    3. -- 删除部门
    4. delete from tb_dept where id = 2;
    5. -- 删除部门下的员工
    6. delete from tb_emp where dept_id = 2;
    7. -- 提交事务
    8. commit;
    9. -- 回滚事务
    10. rollback ;

     1、事务的四大特性

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

    三、索引

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

    数据结构:B+树

     

    1. -- 创建索引
    2. create [unique] index 索引名 on 表名(字段名);
    3. -- 查看索引
    4. show index from 表名;
    5. -- 删除索引
    6. drop index 索引名 on 表名;

    四、Mybatis

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

    1、入门

    (1)准备工作 

     

     (2)配置Mybatis

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

     (3)定义mapper接口

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

    (4)定义测试类

    1. @SpringBootTest
    2. class MybatisApplicationTests {
    3. @Autowired
    4. private UserMapper userMapper;
    5. @Test
    6. public void testusermapper() {
    7. List <User> userList = userMapper.list();
    8. userList.stream().forEach(user -> {
    9. System.out.println(user);
    10. });
    11. }
    12. }

    2、JDBC介绍

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

    SpringBoot+Mybatis 完胜 JDBC

    3、数据库连接池

    (1)定义 

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

    (2)优势

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

    (3)接口 

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

    1. <dependency>
    2. <groupId>com.alibaba</groupId>
    3. <artifactId>druid-spring-boot-starter</artifactId>
    4. <version>1.2.8</version>
    5. </dependency>

    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修饰的字段之外带有各参数的构造器方法
    1. import lombok.Data;
    2. @Data
    3. public class user {
    4. private Integer id;
    5. private String name;
    6. private Short age;
    7. private Short gender;
    8. private String phone;
    9. }
  • 相关阅读:
    7天酒店蝉联“年度杰出投资价值酒店品牌” 加速下沉市场拓展
    『忘了再学』Shell基础 — 8、管道符介绍
    uni-app网络请求封装及发送
    云计算与大数据 第13章 云操作系统OpenStack习题带答案
    fscan工具的使用
    X-ray diffraction
    纳百川冲刺创业板上市:计划募资约8亿元,宁德时代为主要合作方
    并发编程day01
    高德地图JSAPI 2.0使用Java代码代替Nginx进行反向代理
    Spring Cloud Gateway中session共享
  • 原文地址:https://blog.csdn.net/weixin_61639349/article/details/132508417