FemalePower项目学习笔记

发布于:2025-08-15 ⋅ 阅读:(15) ⋅ 点赞:(0)

本文整理了 Spring Boot + MyBatis-Plus 开发中常用的注解和功能:

  • 全局异常处理(@RestControllerAdvice
  • 接口文档(Knife4j)
  • 逻辑删除(@TableLogic
  • 字段忽略(@JsonIgnore
  • saveOrUpdate 用法
  • 公共字段抽取
  • 枚举的持久化与序列化(@EnumValue / @JsonValue
  • 配置文件绑定(@ConfigurationProperties

1. @RestControllerAdvice — 全局异常处理

当在全局异常处理器类上加上 @RestControllerAdvice 注解后,所有返回 JSON 的接口发生异常时,都会被该类捕获并统一处理,从而避免接口异常信息杂乱无章。


2. Knife4j — 接口文档生成工具

  • @Tag
    写在类上,将接口进行分组,并添加描述。

    @Tag(name = "用户管理", description = "用户相关接口")
    public class UserController {}
    
  • @Operation
    写在方法上,为接口提供描述信息。


3. 逻辑删除

背景

逻辑删除是指在数据库中不真正删除记录,而是通过一个标识位(如 is_deleted)来标记记录是否被删除。

配置方式

步骤一:application.yml

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: flag         # 全局逻辑删除字段
      logic-delete-value: 1            # 删除时的值
      logic-not-delete-value: 0        # 未删除时的值

步骤二:实体类字段

@Schema(description = "逻辑删除")
@JsonIgnore
@TableLogic
@TableField("is_deleted")
private Byte isDeleted;

⚠ 注意:逻辑删除只对 MP 自动生成的 SQL 生效,自己写的 XML SQL 需要手动加条件。

执行 removeById 时,本质是执行更新语句,而不是物理删除。


4. @JsonIgnore — 忽略字段序列化

有些字段(如 create_timeupdate_timeis_deleted)在接口返回时无需展示,可使用:

@JsonIgnore
private Date createTime;

5. saveOrUpdate 方法

  • 主键为空 → 插入(insert

  • 主键有值 → 判断是否存在:

    • 存在 → 更新(update
    • 不存在 → 插入(insert

6. 公共字段抽取

可定义一个基类 BaseEntity 存放公共字段(如 idcreateTimeupdateTimeisDeleted),其他实体类继承即可,避免重复定义。


7. 枚举与 @EnumValue / @JsonValue

  • @EnumValue:数据库持久化时,MP 会用这个字段的值进行存储和查询。
  • @JsonValue:JSON 序列化时,返回该字段值,而不是枚举名。

示例:

@Getter
public enum ItemType {
    APARTMENT(1, "公寓"),
    ROOM(2, "房间");

    @EnumValue
    @JsonValue
    private final Integer code;
    private final String name;

    ItemType(Integer code, String name) {
        this.code = code;
        this.name = name;
    }
}

效果:

  • 数据库存储:1
  • JSON 返回:1

8. @ConfigurationProperties — 配置文件绑定

相比 @Value,它能批量绑定配置,代码更简洁。

配置文件

app:
  datasource:
    url: jdbc:mysql://localhost:3306/testdb
    username: root
    password: 123456

配置类

@Component
@ConfigurationProperties(prefix = "app.datasource")
public class DataSourceProperties {
    private String url;
    private String username;
    private String password;
    // Getter & Setter
}

使用

@Service
public class DataSourceService {
    @Autowired
    private DataSourceProperties props;

    public void printInfo() {
        System.out.println(props.getUrl());
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到