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

news2024/11/28 19:05:26

之前学习过的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)内连接

① 隐式内连接

-- 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)外连接

① 左外连接

-- 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;

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、案例

-- 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+树

 

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

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

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

四、Mybatis

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

1、入门

(1)准备工作 

 

 (2)配置Mybatis

#驱动类名称
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接口

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

(4)定义测试类

@SpringBootTest
class MybatisApplicationTests {

    @Autowired
    private UserMapper userMapper;

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

2、JDBC介绍

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

SpringBoot+Mybatis 完胜 JDBC

3、数据库连接池

(1)定义 

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

(2)优势

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

(3)接口 

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

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.2.8</version>
</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修饰的字段之外带有各参数的构造器方法
import lombok.Data;

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/968077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

性能测试(测试系列10)

目录 前言&#xff1a; 1.什么是性能测试 1.1生活中遇到的软件问题 1.2性能测试的定义 1.3性能测试和功能测试有什么区别 1.4性能的好坏的区分 1.5影响一个软件性能的因素 2.为什么要进行性能测试 3.性能测试常见的术语以及衡量指标 3.1并发 3.2用户数 3.3响应时间 …

Jmeter如何设置中文版

第一步&#xff1a;找到 apache-jmeter-5.4.3\bin目录下的 jmeter.properties 第二步:打开 三&#xff0c;ctrf 输入languageen&#xff0c;注释掉&#xff0c;增加以行修改如下 四&#xff0c;ctrs 保存修改内容&#xff0c;重新打开jmeter就可以了

golang-bufio 缓冲写

1. 缓冲写 在阅读这篇博客之前&#xff0c;请先阅读上一篇&#xff1a;golang-bufio 缓冲读 // buffered output// Writer implements buffering for an io.Writer object. // If an error occurs writing to a Writer, no more data will be // accepted and all subsequent…

5.0: Dubbo服务导出源码解析

#Dubbo# 文章内容 Dubbo服务导出基本原理分析Dubbo服务注册流程源码分析Dubbo服务暴露流程源码分析服务导出的入口方法为ServiceBean.export(),此方法会调用ServiceConfig.export()方法,进行真正的服务导出。 1. 服务导出大概原理 服务导出的入口方法为ServiceBean.export…

stm32之28.ADC

须看原理图&#xff08;引脚、电压值、ADC几号通道&#xff09;配置 。 若对比值0~4096 模拟电压/参考电压4096/x 假设模拟电压2.1V&#xff0c;参考电压3.3v&#xff0c;4096/x3.3/2.1 ->3.3x2.1x4096 ->x2,606.5 也可反推出模拟电压 ADC转换时间 ADC时钟来源于…

leetcode645. 错误的集合(java)

错误的集合 题目描述优化空间代码演示 题目描述 难度 - 简单 LC645 - 错误的集合 集合 s 包含从 1 到 n 的整数。不幸的是&#xff0c;因为数据错误&#xff0c;导致集合里面某一个数字复制了成了集合里面的另外一个数字的值&#xff0c;导致集合 丢失了一个数字 并且 有一个数…

时序预测 | MATLAB实现CNN-GRU卷积门控循环单元时间序列预测(风电功率预测)

时序预测 | MATLAB实现CNN-GRU卷积门控循环单元时间序列预测&#xff08;风电功率预测&#xff09; 目录 时序预测 | MATLAB实现CNN-GRU卷积门控循环单元时间序列预测&#xff08;风电功率预测&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.时序预测 | MA…

Python中的绝对和相对导入

在本文中&#xff0c;我们将看到Python中的绝对和相对导入。 Python中导入的工作 Python中的import类似于C/C中的#include header_file。Python模块可以通过使用import导入文件/函数来访问其他模块的代码。import语句是调用import机制的最常见方式&#xff0c;但它不是唯一的…

常见数学名词的物理意义(更新中)

BetterExplained – Math lessons that click 一、复数 i 的物理意义就是旋转&#xff0c;i 就是逆时针旋转90&#xff0c;i*i 就是逆时针旋转180 加法&#xff1a;实部相加&#xff0c;虚部相加 乘法&#xff1a; 复数zxyi控制了函数的放缩和旋转 ——x 放缩&#xff0c;…

Shell开发实践:服务器的磁盘、CPU、内存的占用监控

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

基于vue-cli创建后台管理系统前端页面——element-ui,axios,跨域配置,布局初步,导航栏

目录 引出安装npm install安装element-ui安装axios 进行配置main.js中引入添加jwt前端跨域配置 进行初始布局HomeView.vueApp.vue 新增页面和引入home页面导航栏总结 引出 1.vue-cli创建前端工程&#xff0c;安装element-ui&#xff0c;axios和配置&#xff1b; 2.前端跨域的配…

SQL查询本年每月的数据

--一、以一行数据的形式&#xff0c;显示本年的12月的数据&#xff0c;本示例以2017年为例&#xff0c;根据统计日期字段判断&#xff0c;计算总和&#xff0c;查询语句如下&#xff1a;selectsum(case when datepart(month,统计日期)1 then 支付金额 else 0 end) as 1月, sum…

UE4 春节鞭炮

先搞个基类&#xff0c;一个鞭炮的 搞个鞭炮类&#xff0c;存多个鞭炮 在构造函数的位置先生成对应的鞭炮数 将鞭炮绑定到绳子上&#xff0c;随绳子摆动而一起摆动 在基类里面写爆炸事件 最后用Timer去调用

一篇文章搞懂Redis缓存

目录 一、什么是缓存缓存的优缺点缓存的优点缓存的缺点 二、Redis缓存三、缓存的更新策略主动更新策略 四、缓存穿透解决方案 五、缓存雪崩解决方案 六、缓存击穿解决方案 一、什么是缓存 我们都知道在计算机中内存的速度比磁盘要快非常多&#xff0c;如果每次都要去磁盘获取数…

《Python魔法大冒险》004第一个魔法程序

在图书馆的一个安静的角落,魔法师和小鱼坐在一张巨大的桌子前。桌子上摆放着那台神秘的笔记本电脑。 魔法师: 小鱼,你已经学会了如何安装魔法解释器和代码编辑器。是时候开始编写你的第一个Python魔法程序了! 小鱼:(兴奋地两眼放光)我准备好了! 魔法师: 不用担心,…

Lesson6---案例:人脸案例

学习目标 了解opencv进行人脸检测的流程了解Haar特征分类器的内容 1 基础 我们使用机器学习的方法完成人脸检测&#xff0c;首先需要大量的正样本图像&#xff08;面部图像&#xff09;和负样本图像&#xff08;不含面部的图像&#xff09;来训练分类器。我们需要从其中提取特…

解决Debian系统通过cifs挂载smb后,中文目录乱码问题

解决Debian系统通过cifs挂载smb后&#xff0c;中文目录乱码问题 //$smb_server/share /mnt/nas_share cifs credentials/root/.smbcredentials,iocharsetutf8 0 0默认通过以上命令挂载smb&#xff0c;但是在查看文件目录时&#xff0c;中文乱码 解决问题方式&#xff1a; de…

BLDC无感方波控制

BLDC无感控制 反电动势过零检测反电动势检测方法比较器模式采样过零信号闭环的建立 BLDC 方波启动技术转子预定位电机的外同步加速电机运行状态的转换 程序部分 反电动势过零检测 它的主要核心就是通过检测定子绕组的反电动势过零点来判断转子当前的位置。 三相六状态 120通电…

JavaScript -【第二周】

文章来源于网上收集和自己原创&#xff0c;若侵害到您的权利&#xff0c;请您及时联系并删除~~~ 理解什么是流程控制&#xff0c;知道条件控制的种类并掌握其对应的语法规则&#xff0c;具备利用循环编写简易ATM取款机程序能力 运算符语句综合案例 1. 运算符 算术运算符赋值运…

【python爬虫】批量识别pdf中的英文,自动翻译成中文上

不管是上学还是上班,有时不可避免需要看英文文章,特别是在写毕业论文的时候。比较头疼的是把专业性很强的英文pdf文章翻译成中文。我记得我上学的时候,是一段一段复制,或者碰到不认识的单词就百度翻译一下,非常耗费时间。本文提供批量识别pdf中英文的方法,后续文章实现自…