本文整理了 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_time
、update_time
、is_deleted
)在接口返回时无需展示,可使用:
@JsonIgnore
private Date createTime;
5. saveOrUpdate
方法
主键为空 → 插入(
insert
)主键有值 → 判断是否存在:
- 存在 → 更新(
update
) - 不存在 → 插入(
insert
)
- 存在 → 更新(
6. 公共字段抽取
可定义一个基类 BaseEntity
存放公共字段(如 id
、createTime
、updateTime
、isDeleted
),其他实体类继承即可,避免重复定义。
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());
}
}