Maven

image-20250925135424815

  • Maven坐标

image-20250925151518259

  • 配置依赖

image-20250925154048279

  • 排除依赖

image-20250925154525058

生命周期

image-20250925154947556

image-20250925155153240

执行方式:

image-20250925155223543

测试

image-20250925190948197

  • 测试方法

image-20250925191304026

image-20250925191530543

单元测试

image-20250925191853121

  • Junit

image-20250925192218766

  • 常见注解

image-20250925195355218

断言

image-20250925193724415

依赖范围

image-20250925203558124

SpringBoot

项目搭建

image-20250927161522337

勾选的选项:

Lombok,Spring Web,MyBatis Framework,MySQL Driver

HTTP

image-20250927161707278

请求数据

  • 请求行

image-20250927162114795

  • 请求头

image-20250927162152781

  • 请求体

image-20250927162241514

响应数据

image-20250927163646113

image-20250927164705804

image-20250927165230321

分层解耦 IOC DI

三层架构

image-20250927194728287

分层解耦

image-20250927210328298

image-20250927210008748

步骤

image-20250927210748471

image-20250927212639179

image-20250927214809752

MYSQL

连接:

mysql -u用户名 -密码 [-h数据库服务器IP地址 -P端口号]

mine:mysql -uroot -pshenentao520

退出: exit

  • 关系型数据库

image-20250928122729409

SQL语句

image-20250928123528214

DDL

数据库

image-20250928123717437

其中database可以换成schema

表结构

  • 创建

image-20250928131355727

约束:

image-20250928132506956

  • 数值类型

image-20250928170948861

  • 字符串类型

image-20250928171525880

  • 日期时间类型

image-20250928171648624

  • 查询,修改,删除

image-20250928184930545

DML

insert

image-20250928185417588

data

image-20250928190704936

delete

image-20250928191136436

DQL

image-20250928194510615

基本查询

image-20250928194648145

不推荐用第二个

条件查询

image-20250928195859361

分组查询

  • 聚合函数

image-20250928201151013

注:聚合函数不参与null的统计

image-20250928201822808

排序查询

image-20250928203653117

分页查询

image-20250928204457073

起始索引:(页码 - 1) * 每页展示记录数

JDBC

image-20250929105746838

格式:

image-20250929105828238

查询:

image-20250929110043956

image-20250929110950913

Mybatis

  • 查询数据

image-20251007105923718

  • 删除用户

image-20251007140028682

image-20251007140649624

  • 新增用户

image-20251007141432140

  • 修改用户

image-20251007145433061

  • 查询用户

image-20251007145919520

XML映射配置

image-20251007151213707

yml配置文件

image-20251008124858916

事务

image-20251013105258319

如添加员工的操作包括保存员工信息和经历信息,两者有一个有误的话会对添加员工有影响,所以要通过事务来让两者同时成功或失败

操作:

image-20251013105336579

  • 动态遍历

image-20251013124602861

事务管理-控制事务

image-20251013110707141

阿里云OSS

image-20251014105703206

参数化配置

image-20251015105534267

  • ConfigurationProperties

image-20251015105352513

登录认证

登录校验

  • Cookie

image-20251018131851307

先通过响应头Set-Cookie把Cookie保存在浏览器上,在通过请求头获取到Cookie

image-20251018131737035

  • Session

与Cookie相似,唯一区别就是在浏览器中保存的是Session的唯一标识(id),前端看不到具体信息,相对安全

image-20251018133212132

image-20251018132534248

  • 令牌

如同身份证一样,真的身份证就通过,伪造的就不行

image-20251018133526145

JWT令牌

image-20251018192747596

生成/解析

image-20251018193157641

过滤器Filter

image-20251019134531937

image-20251019134804620

  • 令牌校验
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.example.tliaswebmanagment.Filter;

import com.example.tliaswebmanagment.utils.JwtUtils;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

@Slf4j
@WebFilter(urlPatterns = "/*")
public class TokenFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;


//1.获取请求路径
String requestURI = request.getRequestURI();
//2.判断时候是登录请求,如果路径中包含/login,说明是登录操作,放行
log.info("登陆成功,放行");
if (requestURI.contains("/login")){
filterChain.doFilter(request,response);
return;
}
//3.获取请求头中的token
String token = request.getHeader("token");

//4.判断token时候存在,如果不存在,说明用户没登录,返回错误信息(401)
if (token == null || token.isEmpty()){
log.info("令牌为空,响应401");
response.setStatus(401);
return;
}
//5.如果token存在,校验令牌,如果校验失败,返回错误信息(401)
try {
JwtUtils.parseToken(token);
} catch (Exception e) {
log.info("令牌为空,响应401");
response.setStatus(401);
return;
}
//校验通过,放行
log.info("令牌通过,放行");
filterChain.doFilter(request,response);
}
}

拦截器Intercepter

image-20251019152258627

image-20251020123952819

  1. 先过安检门(Interceptor)
    • preHandle() —— 进门检查:鉴权、限流、日志、包装请求……
      返回 true → 放行;返回 false → 直接打回(后面全不执行)
  2. 到达 Controller 执行业务
  3. 业务办完,回来再过安检门
    • postHandle() —— 出门检查:可以改 ModelAndView(数据+页面),但异常时不会进来
  4. 渲染视图(JSON/HTML 等)
  5. 最后再过一次安检门
    • afterCompletion() —— 无论成功失败都会进:清理资源、记录耗时、统计异常……
  • 拦截路径

image-20251020132331114

image-20251020133231922

AOP

image-20251020184618049

步骤

image-20251020185201398

核心概念

image-20251020191951243

  1. 连接点 JoinPoint
    = 整部电影里每一句台词(每一个方法)。
    特效师可以随时在任意一句台词上做手脚,但还没决定到底改哪句。
  2. 通知 Advice
    = 具体加的特效本身:“火焰怎么烧、烧多久”。
    在代码里就是一个普通方法,里面写“记录时间、开事务、打日志”这些重复动作
    一句话:“改什么内容”
  3. 切入点 PointCut
    = 特效师真正挑选的那些台词:“只要男主角说英文,就加火焰特效”。
    一句话:“要改哪里”
  4. 切面 Aspect
    = 把“要改哪里”和“改什么内容”订在一起的合同:
    “男主角英文台词 + 火焰特效”合成一张特效表,这就是切面。
    一句话:“切入点 + 通知”的配对
  5. 目标对象 Target
    = 被加特效的男主角本人(原始业务类,如 DeptServiceImpl)。
    完全不知道自己被烧了火焰,照常背台词。
  • 执行流程

image-20251020192514362

当 Spring 容器启动时,如果发现某个 Bean(例如 DeptServiceImpl)的方法匹配了 @Aspect 切面里定义的切入点表达式,就会提前为它生成一个动态代理对象(JDK 动态代理或 CGLIB 代理)。
这个代理对象实现了与目标对象相同的接口(或是目标对象的子类),因此方法签名完全一致,从外表上看两者没有任何区别。

在代理对象的同名方法内部,Spring 会把我们定义的通知代码(如 @Around@Before@After 等)织入进去:
先执行切面里写的附加逻辑(如记录时间、开启事务、权限校验),再通过 joinPoint.proceed() 回调原始目标对象的真实方法,最后再执行后置逻辑

因此,当 Controller 中通过 @Autowired 注入 DeptService 并调用 deptService.list() 时,实际拿到的是容器里的代理对象,而不是原始的目标对象。
这次调用首先进入的是代理方法,从而自动触发了 AOP 的逻辑;也正因为如此,AOP 只对**“从外部穿过代理对象”的方法调用生效,而类内部自调用**(如 this.list())则不会触发代理,也就不会进入切面

通知类型

内部

image-20251021193711050

外部

image-20251022125507823

jar包的话用maven里的package

image-20251022125620194

通知顺序

image-20251021190651896

切入点表达式execution&annotation

image-20251021191229321

image-20251021191452730

连接点

image-20251021192127691

原理篇

配置

image-20251022124406118

jar包的话用maven里的package

image-20251022125620194

然后再target里找

image-20251022125757449

Maven

分模块设计

image-20251022130730476

对开发和维护更有利,增加复用性

image-20251022130955573

继承

image-20251022185027263

打包方式用<package>...</package>修改

image-20251022184946665

只支持单继承,不能多继承,但可以多重继承

  • 版本锁定

image-20251022191340691

  • 自定义属性

image-20251022191154430

聚合

image-20251022192210487