MySQL再次基础 向初级工程师迈进
作者:在计算机行业找不到工作的大四失业者
Run run run ! ! !
1、MySQL概述
1.1数据库相关概念

1.2MySQL数据库

2、SQL
2.1SQL通用语法
- SQL语句可以单行或多行书写,以分号结尾。
- SQL语句可以使用空格/缩进来增强语句的可读性。
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
- 注释:单行注释:--注释内容 或#注释内容(MySQL特有),多行注释: /*注释内容 */

2.2 DDL
数据定义语言


表的创建

通过desc 查看表

通过show create table 来查询建表语句 。

对于ENGINE=InnoDB,这个会在之后详细的讲解;CHARSET = utf8MB4 就是默认的字符集;COLLATE是它的一个排序规则。
数据类型
数值类型:

字符串类型:

日期类型:

测试(根据需求创建表设计合理的数据类型和长度):

create table emp(id int comment '编号',workno varchar(10) comment '员工工号',workname varchar(10) comment '员工姓名',gender char(1) comment '性别',age tinyint unsigned comment '年龄',idcard char(18) comment '身份证号',entrydata date comment '入职时间'
)comment '员工表';
可以通过desc查看表的结构:

查看建表语句,通过show create table

DDL-表操作-修改
添加字段:
alter table emp add nickname varchar(20) comment '昵称';

修改字段:
① 修改字段类型:
alter table emp modify nickname varchar(30);
② 修改字段名和字段类型:
alter table emp change nickname username varchar(30) comment '用户名';
将emp表的nickname字段修改为udername,类型为varchar(30)

删除字段:
alter table emp drop username;
将emp中的字段username删除。

修改表名:
alter table emp rename to employee;
将表名字修改为employee。

删除表:
drop table 表名;
2.3 DML
用于完成数据的增删改
- insert 添加数据
- update 修改数据
- delete 删除数据
添加数据:

insert into employee values(1, '1', 'Itcast', '男', 10, '123456789101', '2000-01-01');

修改数据:

-- 修改id为1 的数据,将name修改为cce
update employee set workname = 'cce' where id = 1;
select * from employee;

-- 修改id为1 的数据,将name修改为cce,gender 修改为女
update employee set workname = 'cce', gender = '女' where id = 1;
select * from employee;

-- 将所有的员工入职日期修改为2008-01-01
SET SQL_SAFE_UPDATES = 0;
update employee set entrydata = '2008-01-01';
select * from employee;

删除数据:
insert into employee values(2, '2', 'cce1', '男', 10, '123456789134', '2004-01-01');
delete from employee where gender = '女';
select * from employee;

2.4 DQL
DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。查询关键字:SELECT。

2.4.1基本查询

-- 1.查询指定字段 name,workno,age 返回
select workname, workno, age from emp;
-- 2.查询所有字段返回
select * from emp;
-- 3.查询所有员工的工作地址,起别名
select workaddress as '工作地址' from emp;
-- 4.查询公司员工的上班地址(不要重复)
select distinct workaddress as '工作地址' from emp;
2.4.2 条件查询 where

--1.查询年龄等于 88 的员工
select * from emp where age = 88;
--2.查询年龄小于 20 的员工信息
select * from emp where age < 20;
--3.查询年龄小于等于 20 的员工信息
select * from emp where age <= 20;
--4.查询没有身份证好的员工信息
select * from emp where idcard is null;
--5.查询有身份证号的员工信息
select * from emp where idcard is not null;
--6.查询年龄不等于 88 的员工信息
select * from emp where age !=88;
--7.查询年龄在15岁(包含)到20岁(包含)之间的员工信息
select * from emp where age >=15 and age <=20;
--8.查询性别为女且年龄小于 25岁的员工信息
select * from emp where gender = '女' and age <25;
--9,查询年龄等于18或20或40 的员工信息
select * from emp where age in(18,20,40);
--10.查询姓名为两个字的员工信息
select * from emp where workname like '__';
-- 11.查询身份证号最后一位是X的员工信息
select * from emp where idcard like '%X';
2.4.3 聚合函数 count max min avg sum

-- 1.统计该企业员工数量
select count(*) from emp;
-- 2.统计该企业员工的平均年龄
select avg(age) from emp;
-- 3.统计该企业员工的最大年龄
select max(age) from emp;
-- 4.统计该企业员工的最小年龄
select min(age) from emp;
-- 5.统计西安地区员工的年龄之和
select sum(age) from emp where workaddress = '西安';
2.4.4分组查询 group by

-- 1. 根据性别分组,统计性员工和女性员工的数量。
select gender, count(*) from emp group by gender;
-- 2. 根据性别分组,统计男性员工和女性员工的平均年龄。
select gender, avg(age) from emp group by gender;
-- 3. 查询年龄小于45的员工 ,并根据工作地址分组,获取员工数量大于等于3的工作地址。
select workaddress, count(*)
from emp
where age < 45
group by workaddress
having count(*) >= 3;
在分组之间过滤使用where,在分组之后过滤使用having。
2.4.5排序查询 oder by

-- 1.根据年龄对公司的员工进行升序排序
select * from emp oder by age asc;
-- 2.根据入职时间,对员工进行降序排序
select * from emp oder by netrydate desc;
-- 3.根据年龄对公司的员工进行升序排序,年龄相同,再按照入职时间进行降序排序
select * from emp oder by age asc, entrydate desc;
2.4.6分页查询 limit

--1.查询第1页员工数据,每页展示10条记录
select * from emp limit 0,10;
也可以下面的
select * from emp limit 10;
--2.查询第2页员工数据,每页展示10条记录
select * from emp limit 10,10;
2.4.7 DQL语句的总结测试
1.查询年龄为20,21,22,23岁的女性员工信息。
select * from emp where gender = '女' and age in(20,21,22,23);
2.查询性别为男 ,并且年龄在 20-40 岁(含)以内的姓名为三个字的员工。
select * from emp
where gender = '男'
and age >=40
and age <=40
and workname like '___';
3.统计员工表中,年龄小于60岁的,男性员工和女性员工的人数。
select gender, count(*)
from emp
where age<60
group by gender;
4.查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序。
select workname, age from emp
where age <= 35
order by age asc, entrydate desc;
5、查询性别为男,且年龄在20-40 岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。
select * from emp
where gender = '男'
and age between 20 and 40
order by age asc, entrydate asc
limit 5;
2.4.8 DQL的执行顺序

2.5 DCL

管理用户:
在mysql中,其用户所拥有的权限信息都存放在系统数据库sysql中的user表

其user表中的内容如下

创建用户 itcast ,只能够在当前主机localhost访问,密码123456;
create user "itcast'@'localhost' identified by'123456';
创建用户 heima ,可以在任意主机访问该数据库,密码123456;
create user 'heima'@'%'identified by'123456';
修改用户 heima 的访问密码为1234;
alter user 'heima'@'%'identified with mysql_native_password by '1234';
删除itcast@localhost用户
drop user 'itcast'@'localhost;
权限控制:


--查询权限
show grants for 'heima'@'%';--授子权限
grant all on itcast.* to 'heima'@'%';-撤销权限
revoke all on itcast.* from 'heima'@'%';
3、函数
函数:是指一段可以直接被另一段程序调用的程序或代码。
字符串函数:

--concat
select concat('Hello',· MySQL');--lower
select lower('Hello');--upper
select upper('Hello');--lpad将01填充到长度为5,使用-填充,结果:---01
select lpad('01',5,'-');--rpad将01填充到长度为5,使用-填充,结果:01---
select lpad('01',5,'-');--trim只去除头部和尾部的空格
select trim(' Hello MySQL ');--substring,结果是Hello
select trim('Hello MySQL', 1, 5);
由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如:1号员工的工号应该为00001.
update emp
set workno = lpad(workno,5,'0');
数值函数:

通过数据库的函数,生成一个六位数的随机验证码,
select lpad(round(rand()*1000000, 0), 6, '0');
日期函数:

案例:查询所有员工的入职天数,并根据入职天数倒序排序。
select name, datediff(curdate(),entrydate) from emp;
流程控制函数:

case when then else end
-- 需求:查询emp表的员工姓名和工作地址(北京上海---->一线城市,其他----> 二线城市)
select
name
( case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end ) as '工作地址'
from emp;
函数测试:


4、约束
概念:
约束是作用于表中字段上的规则,用于限制存储在表中的数据,其目的是保证数据库中数据的正确、有效性和完整性。

约束演示:

依次使用的约束:
- primary key, auto_increment
- not null, unique
- check
- default
- 无
create table user(id int primary key auto_increment comment '主键',name varchar(10) not null nique comment '姓名',age int check( age> 0 && age <= 120 ) comment '年龄',status char(1) default '1' comment '状态',gender char(1) comment '性别'
)comment '用户表';
外键约束:
外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。

注意 : 目前上述的两张表,在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的。


5、多表查询
5.1多表关系



5.2多表查询概述

消除笛卡尔积
select * from emp, dept
where emp.dept_id = dept.id;
多表查询的分类:

5.3内连接
两张表的交集

-- 1.查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现)
select emp.name, dept.name
from emp, dept
where emp.dept_id = dept.id;
-- 2.查询每一个员工的姓名,及关联的部门的名称(显式内连接实现)
select * from emp inner join dept
on emp.dept_id = dept.id;
其中inner关键字可以被省略。
5.4外连接

--1.查emp表的所有数据,和对应的部门信息(左外连接)
select emp.*, dept.name from emp
left outer join dept
on emp.dept_id = dept.id;
左外连接会完全包含左表的信息。outer可以被省略。
--2.查询dept表的所有数据,和对应的员工信息(右外连接)
select dept.*, emp.* from emp
right outer join dept
on emp.dept_id = dept.id;
右外连接会完全包含右表的信息。outer可以被省略。
5.5自连接

-- 1.查询员工及其所属领导的名字
select e1.name, e2.name from emp e1, emp e2
where e1.managerid = e2.id;
-- 2.查询所有员工emp及其领导的名字emp,如果员工没有领导,也需要查询出来
select e1.name, e2.name from emp e1
left join emp e2
on e1.managerid = e2.id;
5.6联合查询

-- 1、将薪资低于5000的员工,和年龄大于50 岁的员工全部查询出来
select * from emp where salary < 5000
union all
select * from emp where age > 50;
union 会去重。同时注意union的时候字段需要相同,两个合并的字段一致
5.7 子查询

标量子查询
-- 1.查询“销售部”的所有员工信息
--查询销售部门的id
select id from dept where name = "销售部"; --根据销售部门id信息再去查询员工信息
select * from emp where dept_id = "4";
合起来:
select * from emp
where dept_id = (select id from dept where name = "销售部");
-- 2.查询在"方东白”入职之后的员工信息
--查询东方白入职之后的员工信息
select entrydate from emp where name = "方东白";--查询指定入职日期之后入职的员工信息
select * from emp where entrydate > '2009-02-12';
合起来:
select * from emp
where entrydate > (select entrydate from emp where name = "方东白");
列子查询:

-- 1.查询“销售部”和“市场部”的所有员工信息
select * from emp
where dept_id
in (select id from dept where name = "销售部" or name = "市场部");
-- 2.查询比财务部所有人工资都高的员工信息
--先找到财务部的id
select id from dept where name = "财务部";--再找到财务部所有人的薪水
select salary from emp
where dept_id = (select id from dept where name = "财务部");--再找比财务部所有人工资都高的员工信息
select * from emp
where salary > all(select salary
from emp where dept_id = (select id
from dept where name = "财务部"));
-- 3.查询比研发部其中任意一人工资高的员工信息
--找到研发部门的id
select id from dept where name = "研发部门";--找到研发部门所有人的薪水
select salary from emp
where dept_id = (select id from dept where name = "研发部门");--找到比研发部门其中任意一个人工资高的员工信息
select * from emp where salary > any(select salary from emp
where dept_id = (select id from dept where name = "研发部门"));
行子查询:
--1.查询与“张无忌”的薪资及直属领导相同的员工信息
--查询张无忌的薪资极其直属领导
select salary, manager_id
from emp
where name = "张无忌";--薪资极其直属领导相同的员工信息
select * from emp
where (salary,manager_id) = (select salary,manager_id
from emp
where name = "张无忌")
表子查询:
-- 1.查询与“鹿杖客",“宋远桥”的职位和薪资相同的员工信息
--查询鹿杖客和宋远桥的职位和薪资
select job,salary from emp
where name = "鹿杖客" or name = "宋远桥";--查询鹿杖客和宋远桥的职位和薪资相同的员工信息
select *from emp where (job,salary)
in (select job,salary from emp
where name = "鹿杖客" or name = "宋远桥")
-- 2.查询入职日期是“2006-01-01”之后的员工信息,及其部门信息
--查入职是“2006-01-01”之后的员工信息
select * from emp where entrydate > '2006-01-01';--查入职是“2006-01-01”之后的员工信息极其部门
select * from
(select * from emp where entrydate > '2006-01-01') e left join dept
on e.dept_id = dept.id;
6、事务
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
例如银行转账:

事务操作:
--设置为手动提交set
@autocommit =0;--转账操作(张三给李四转账1000)--1.查询张三账户余额
select *from account where name ='张三';--2.将张三账户余额-1000
update account set money=money-1000 where name ='张三';--3.将李四账户余额+1000
update account set money = money + 1000 where name ='李四';--提交事务
commit;--回滚事务
rollback;
事务的四大特定:
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
- 隔离性(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
并发事务问题:

事务的隔离级别:

至此你已经成为了一名初级工程师。
山高路远,别太功利导致忘了欣赏路边的风景!
享受它,感受自己的进步.........
2025/3/13

相关文章:
MySQL再次基础 向初级工程师迈进
作者:在计算机行业找不到工作的大四失业者 Run run run ! ! ! 1、MySQL概述 1.1数据库相关概念 1.2MySQL数据库 2、SQL 2.1SQL通用语法 SQL语句可以单行或多行书写,以分号结尾。SQL语句可以使用空格/缩进来增强语句的可读性。MySQL数据库的SQL语句不区…...
使用 Doris 和 Hudi
作为一种全新的开放式的数据管理架构,湖仓一体(Data Lakehouse)融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势,帮助用户更加便捷地满足各种数据处理分析的需求,在企业的大数据体系中已经得到越来越…...
Linux———迷你在线商城
一、项目简介 1、演示视频 商城项目演示视频 2、功能概述 用户认证管理:支持用户注册、登录和注销操作,通过SQLite数据库存储用户信息(如用户名和密码),确保用户数据的安全性和完整性。 商品展示:能够根据…...
城市林业的无声革命:人工智能与古老生态学如何重新设计城市
城市林业的无声革命:人工智能与古老生态学如何重新设计城市 在摩天大楼的阴影下,一场静悄悄的变革正在发生——它融合了硅芯片与古老根系,算法与原住民智慧。 作者:保罗桑杜 作者利用 PicLumen 创建的图像 城市森林不再只是城市…...
Linux第七讲:基础IO
Linux第七讲:基础IO 1.什么是文件2.文件操作的复习2.1文件基本操作复习2.2将信息输出到显示器,你有哪种方法2.3stdin、stdout、stderror2.4细节问题讲解 3.系统文件IO3.1open函数使用3.1.1理解标志位3.1.2权限问题3.1.3write和read接口介绍3.1.4谈谈fd以…...
【GIT】重新初始化远程仓库
有的时候我们克隆远端仓库会出错: git clone --depth 1 git116.*.*.*:/srv/customs.git D:\dev\projects\kdy\customs11\customs Cloning into D:\dev\projects\kdy\customs11\customs... remote: Enumerating objects: 1494, done. remote: Counting objects: 100…...
力扣热题 100:多维动态规划专题经典题解析
系列文章目录 力扣热题 100:哈希专题三道题详细解析(JAVA) 力扣热题 100:双指针专题四道题详细解析(JAVA) 力扣热题 100:滑动窗口专题两道题详细解析(JAVA) 力扣热题 100:子串专题三道题详细解析(JAVA) 力…...
【Unity】在项目中使用VisualScripting
1. 在packagemanager添加插件 2. 在设置中进行初始化。 Edit > Project Settings > Visual Scripting Initialize Visual Scripting You must select Initialize Visual Scripting the first time you use Visual Scripting in a project. Initialize Visual Scripting …...
Pytest自动化测试框架pytest-xdist分布式测试插件
平常我们功能测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟,如果单个测试人员执行需要1000分钟才能跑完; 当项目非常紧急时,会需要协调多个测试资源来把任务分成两部分,于是执行时间缩短一…...
文件解析漏洞靶场解析全集详解
lls解析漏洞 目录解析 在网站的下面将一个1.asp文件夹,在里面建一个2.txt文件在里面写入<% -now()%>这个显示时间的代码,再将文件名改为2.jpg。 发现2.jpg文件以asp形式执行 畸形文件解析 将2.jpg文件移到网站的下面与1.asp并列,将名…...
C语言数据结构:数组
1. 数组(Array) 1.1 定义 数组是一种线性数据结构,由相同类型的元素组成,这些元素在内存中按顺序存储。数组的大小在声明时确定,且不可动态改变。 1.2 类型细分 根据维度和用途,数组可以分为以下几种类型…...
LeetCode-移动零
一、题目描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums […...
PDF Reader
Acrobat Reader...
孔夫子根剧关键字获取在售商品 API
要使用孔夫子旧书网根据关键字获取在售商品的 API,需要以下步骤1: 注册与认证:在孔夫子旧书网的开发者平台注册一个账号,登录后创建一个新的应用,以获取 API 密钥(key)和调用密钥(s…...
Qt的QToolButton设置弹出QMenu下拉菜单
在Qt中,使用QToolButton显示下拉菜单可以通过以下步骤实现: 基本实现步骤 创建QToolButton:实例化一个QToolButton对象。创建QMenu:实例化一个QMenu作为下拉菜单。添加菜单项:通过QMenu::addAction方法添加动作&…...
【一次成功】Win10本地化单机部署k8s v1.31.2版本及可视化看板
【一次成功】Win10本地化单机部署k8s v1.31.2版本及可视化看板 零、安装清单一、安装Docker Desktop软件1.1 安装前<启用或关闭Windows功能> 中的描红的三项1.2 查看软件版本1.3 配置Docker镜像 二、更新装Docker Desktop三、安装 k8s3.1 点击启动安装3.2 查看状态3.3 查…...
Elasticsearch Java High Level Client [7.17] 使用
es 的 HighLevelClient存在es源代码的引用,结合springboot使用时,会存在es版本的冲突,这里记录下解决冲突和使用方式(es已经不建议使用这个了)。 注意es服务端的版本需要与client的版本对齐,否则返回数据可…...
Vue项目搜索引擎优化(SEO)终极指南:从原理到实战
文章目录 1. SEO基础与Vue项目的挑战1.1 为什么Vue项目需要特殊SEO处理?1.2 搜索引擎爬虫工作原理 2. 服务端渲染(SSR)解决方案2.1 Nuxt.js框架实战原理代码实现流程图 2.2 自定义SSR实现 3. 静态站点生成(SSG)技术3.1…...
LeetCode:93. 复原 IP 地址(DFS Java)
目录 93. 复原 IP 地址 题目描述: 实现代码与解析: DFS 原理思路: 93. 复原 IP 地址 题目描述: 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0)…...
Spring Boot 中实现全局 Token 验证的两种方式
文章目录 学习文章:Spring Boot 中实现全局 Token 验证的两种方式 一、为什么需要全局 Token 验证?二、使用拦截器实现全局 Token 验证1. 创建 Token 验证拦截器2. 注册拦截器3. 测试拦截器 三、使用过滤器实现全局 Token 验证1. 创建 Token 验证过滤器2…...
【性能测试】Jmeter下载安装、环境配置-小白使用手册(1)
本篇文章主要包含Jmeter的下载安装、环境配置 添加线程组、结果树、HTTP请求、请求头设置。JSON提取器的使用,用户自定义变量 目录 一:引入 1:软件介绍 2:工作原理 3:安装Jmeter 4:启动方式 …...
【Matlab仿真】如何解决三相交流信号源输出波形失真问题?
问题描述 如标题所示,在搭建simulink模型过程中,明明模型搭建的没有问题,但是输出的波形却不是理想的正弦波,影响问题分析。 问题分析 以三相交流信号源输出波形为例,输出信号理应为三相正弦量,但是仿真…...
Fiora聊天系统本地化部署:Docker搭建与远程在线聊天的实践指南
文章目录 前言1.关于Fiora2.安装Docker3.本地部署Fiora4.使用Fiora5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 这个通讯软件泛滥的时代,每天都在刷着同样的朋友圈、看着千篇一律的表情包,是不是觉得有点腻了&#…...
metersphere接口测试(1)使用MeterSphere进行接口测试
文章目录 前言接口文档单接口测试环境配置梳理接口测试场景测试接口 接口自动化怎么写复用性高的自动化测试用例 总结 前言 大汉堡工作第203天,本篇记录我第一次接触接口测试任务,最近有些懈怠啊~ 接口文档 首先就是接口地址,接口测试时用…...
【实战ES】实战 Elasticsearch:快速上手与深度实践-8.2.2成本优化与冷热数据分离
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 8.2.2AWS OpenSearch Serverless 成本优化与冷热数据分离深度实践1. 成本构成分析与优化机会识别1.1 Serverless模式成本分布1.2 冷热数据特征分析数据特征矩阵 2. 冷热数据…...
MTK Android12 安装app添加密码锁限制
提示:通过安装前输入密码的需求,来熟悉了解PMS 基本的安装流程 文章目录 一、需求实现需求原因提醒 二、UML图-类图三、参考资料四、实现效果五、需求修改点修改文件及路径具体修改内容 六、源码流程分析PMS的复杂性代码量实现aidl 接口PackageManagerSe…...
Redis 集合(Set)
Redis 集合(Set) Redis 是一款高性能的键值数据库,以其高性能、易用性以及丰富的数据结构而广受欢迎。在 Redis 中,集合(Set)是一种重要的数据结构,它支持多种操作,如添加、删除、查找元素,以及集合间的运算。本文将详细介绍 Redis 集合的特点、操作和应用场景。 Redi…...
[数据结构]堆详解
目录 一、堆的概念及结构 二、堆的实现 1.堆的定义 2堆的初始化 3堆的插入 编辑 4.堆的删除 5堆的其他操作 6代码合集 三、堆的应用 (一)堆排序(重点) (二)TOP-K问题 一、堆的概念及结构 堆的…...
基于Python+Vue开发的旅游景区管理系统源码+运行步骤
项目简介 该项目是基于PythonVue开发的旅游景区管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的旅游景…...
SpringBoot使用Logback日志框架与综合实例
日志框架的使用,系列文章: 《SpringBoot使用Logback日志框架与综合实例》 《SpringBoot使用@Slf4j注解实现日志输出》 《Log4j2日志记录框架的使用教程与简单实例》 《SpringBoot使用AspectJ实现AOP记录接口:请求日志、响应日志、异常日志》 《SpringBoot使用AspectJ的@Arou…...

