2026-03-21
昨日回顾 3.11 - 3.20
在 Controller 层对参数校验 @NotBlank 等,会直接抛出异常给前端,不进入业务层。请求接收阶段。 在 实体类 中使用 JPA 注解。持久化阶段。
@RequestParam 会要求接口的请求参数全部存在,使用 @ModelAttribute 让 get 请求的传参可选
PageHelper 的版本问题导致我分页的功能失败了?!!能够查询但是不能分页。成功的版本:2.1.0 失败的版本:1.3.0
函数重载时,只有一个参数,但是既有 String 重载,又有 T 模板重载,优先级的问题,会优先执行更加具体的参数
在 JSON 网络请求传输的过程中,不支持数学公式 –> 反斜杠的问题,反斜杠需要在前端进行转义。
数据库存储的字符格式最好是utf-8。utf8mb4 ? utf8 字符集有什么区别?
Enum 的使用。默认是字段名,而不是数值。序列化,反序列化。
POJO、DTO、VO 在 Springboot 中的使用。DTO 是前端传过来的, VO 是后端传给前端的, 使用 BeanUtils 的方法进行复制属性
Service 业务层只关注正常流程,异常情况交给全局处理器,一般更推荐使用 @ControllerAdvice + @ExceptionHandler
枚举类通过 @Getter 标注,传值的时候,通过 getter 方法(.getCode()),获取到对应异常场景的数值。
当业务函数没有返回值时,接口返回类型可以为 Result<Void>
Controller层负责接收请求、返回响应(对外接口);Service层负责业务逻辑、数据处理(对内实现)
可以通过配置,给 created_time 跟 updated_time 两个字段自动赋值,避免每次都写代码
@ApiModelProperty 有什么用?
动态 SQL 使用学习 √ Mybatis 的学习 √
Jackson 反序列化前端传入的字段 ?
三种传值方式:传对象,一一对应、传map,一一对应、注解声明 @Param 一一对应
apifox 协作: 一直 401,没得 token。脚本自动获取 login 接口的 token 是全局变量,被环境变量 token 覆盖了,然后环境变量的token又是空值
全局异常处理器 @RestControllerAdvice @ExceptionHandler
对一个对象打开 diagram 可以看到继承的层级关系
@MapKey 注解:当 mapper 返回的内容是 Map 类型的数据时,会要求添加注解(如果装了 MybatisX 插件,可能会误报) 通过 Editor/Inspections/Mybatis 关闭
Controller 的文件命名就是 Restful 接口的资源前缀。不要混合使用
SpringAOP --> @Aspect @Component @Around ?
@Sl4j 注解的日志对象是 log ,直接使用。log 的打印,支持变量占位符 {}
Mybatis 插件实现分页查询 PageHelper
条件查询当筛选条件过多的时候,可以用一个对象封装查询条件的参数。这样就不用修改 Controller 了,直接修改对象。 条件查询是否存在条件用 动态SQL 。<if>、<where>
判断集合为空,用 CollectionUtils 类中的方法,isEmpty(),不要直接用 null ==
一次性插入多条数据,不能是静态的 sql ,得用动态的 SQL ,<foreach> 标签。不是多次插入 1 条数据(IO操作)
插入完数据之后,返回新插入数据的 id ,可以用 option 注解,直接返回进行赋值(查询回显)
一组操作的集合=事务。一个 service 进行多次 sql 才进行事务管理。事务的传播行为 propagation。
jetbrains 插件:
grep console 控制台输出颜色高亮。自己设置哪些内容高亮。选中设置。
MyBatisX mybatic辅助插件
Ctrl+Alt+T 快速选择一个代码块,添加 if,try catch 等外部代码块。surround with
事务的四大特性(ACID):
原子性:事务是不可分割的最小单元,要么全部成功,要么全部失败
一致性:事务完成时,必须使所有的数据都保持一致状态
隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
文件上传用 spring.servlet.multifile 进行设置文件大小
配置变量,application.yaml 中,aliyun.oss.xxx 用 @value 进行接收配置 当要配置的参数有很多时,通过 @ConfigurationProperties 封装到对象中
filter 跟 interceptor 的区别
设计数据库的时候,created_time 跟 updated_time 两个字段同时出现,这是规范。 updated_time 核心价值是数据溯源、增量同步、业务规则支撑,是数据全生命周期管理的关键字段;最佳实践是让数据库自动维护,避免手动赋值的遗漏和冗余;
Ctrl + O 可以在 idea 中快速完成重写方法
响应数据的时候,有些字段不希望被返回,可以通过 @JsonIgnore 实现,最好的实践方式是 封装固定的返回实体类 VO
Sql 中使用 unique 的底层实现逻辑
sql 和 Java 处理数据的时候,sql 主要负责数据密集行操作,有索引优化机制;java 主要负责复杂业务处理。核心原则是:让数据库做它擅长的事(数据操作),让 Java 做它擅长的事(业务逻辑)。
使用 sql 生成实体类代码时,要注意字段名的驼峰规范
前后端开发的时候,数据交互一般最后才做。刚开始写 api 接口都是先写 mock 云端接口。云端的 ip 地址 + host。然后最后才来做前后端联调。
今日收获
HTTP 响应状态码
遵循规范,默认情况下:
- 信息响应 1xx 成功响应 2xx 重定向消息 3xx 客户端错误 4xx 服务端错误 5xx
规范化的 5 位响应状态码:
- 设计思路:A-BB-CC 模式
- A:响应场景,同上。2 开头:成功响应;4 开头:客户端错误或业务逻辑阻断;5开头:服务端错误或第三方服务异常
- BB:业务模块。00:全局通用;示例:01:认证模块;02:用户管理模块…
- CC:具体的场景序号,从 01 开始递增。
企业级设计规范:(企业级对数据追踪及其敏感)
- 设计思路:分段管理
- 示例:10000-19999:通用错误 20000-29999:用户模块 … 90000-99999:系统错误
备注:服务端的系统内部错误不应该暴露给用户,直接提示 “稍后重试”
在代码中,通过定义枚举类来提高代码的可读性,并返回对应的响应状态码;全局错误拦截器等
Java 基础语法
- isEmpty() 跟 isBlank() 方法的区别:总结:
isBlank()的判断范围包含了isEmpty(),额外处理了全空白字符的情况。
| 方法 | 判断逻辑 | 示例场景 |
|---|---|---|
isEmpty() | 判断字符串是否为 null 或长度为 0 | ""、null |
isBlank() | 判断字符串是否为 null、长度为 0,<br />或全由空白字符(空格、制表符、换行符等)组成 | ""、null、" "、"\t"、"\n" |
项目经验
JWT 认证:(记忆)
- JWT 由 3 部分组成:Header.Payloud.Signature
- Header 部分是一个被 Base64 编码的 JSON 对象,描述 JWT 的元数据:签名算法、令牌类型。
- Payload 部分也是一个被 Base64 编码的 JSON 对象,用来存放实际需要传递的非敏感数据
- Signature 部分是对前两部分的签名,防止数据篡改。
- JWT 由 3 部分组成:Header.Payloud.Signature
token 管理:
每次登录都生成一个新 Token 吗?(唯一 token)
允许多端登录的情况下,可以每个客户端生成一个 token ,每个用户可以对应一个 token list
只允许单端登录时,需要保证 token 的唯一性:token 黑名单 or 存储一对一的唯一有效 token
用户只要拿到唯一令牌证明 token 有效就行?(身份匹配)
- No. 先校验 token 的有效性,再比对载荷中携带的用户数据是否匹配
- 防止任何人拿到一个有效 token 都可以冒充成其他用户
Git 经验:
- 当我的 git 有文件没有add时,执行了pull指令,未add的文件不会被覆盖。pull 本质是 fetch+merge 的组合指令
算法训练
<img src="https://gitee.com/kualk/pic-go/raw/master/imgs/image-20260321234340279.png" alt="image-20260321234340279" style="zoom:60%;" />
<img src="https://gitee.com/kualk/pic-go/raw/master/imgs/image-20260321234348208.png" alt="image-20260321234348208" style="zoom:60%;" />
<img src="https://gitee.com/kualk/pic-go/raw/master/imgs/image-20260321234355678.png" alt="image-20260321234355678" style="zoom:60%;" />
项目进度
项目宣传:https://gitee.com/Seniorsy/leet-model-test

我的疑问
- 什么时候手动抛出异常,什么时候拦截异常?
经验分享
使用AI编程的时候,推荐使用集成了 ai 的 idea 编辑器。Jetbrains 里的 Lingma 插件不好用,支持的上下文太少了,输入 token 有限制,不好用。Trae有国内版,国际版,国际版可以用国外的大模型,每月免费用 3$ ,一些非代码内容可以交给国内版完成。
做项目,设计的时候,拆分成对应的模块,解耦,降低复杂度。大任务拆成小任务
在 菜鸟教程上 ,偶然看到有一个技术 “SSL 免费证书申请 - Certbot” ,https://www.runoob.com/http/ssl-certbot.html (我的网站的 SSL 证书过期了😊有空看一下)