Skip to content

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 部分是对前两部分的签名,防止数据篡改。
  • 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

image-20260321234122897


我的疑问

  • 什么时候手动抛出异常,什么时候拦截异常?

经验分享

  • 使用AI编程的时候,推荐使用集成了 ai 的 idea 编辑器。Jetbrains 里的 Lingma 插件不好用,支持的上下文太少了,输入 token 有限制,不好用。Trae有国内版,国际版,国际版可以用国外的大模型,每月免费用 3$ ,一些非代码内容可以交给国内版完成。

  • 做项目,设计的时候,拆分成对应的模块,解耦,降低复杂度。大任务拆成小任务

  • 在 菜鸟教程上 ,偶然看到有一个技术 “SSL 免费证书申请 - Certbot” ,https://www.runoob.com/http/ssl-certbot.html (我的网站的 SSL 证书过期了😊有空看一下)

记录学习,分享技术