MyBatisPlus中使用@EnumValue实现标记枚举类中与数据库字段映射的属性
场景
业务开发中,mysql中某字段为枚举类型,比如某某type、某某状态,
数据库字段中存储int数字,而Java实体中需要使用枚举类型,如何处理其映射关系。
@EnumValue 是 MyBatis-Plus 提供的注解,用于 标记枚举类中与数据库字段映射的属性,
解决 Java 枚举与数据库值之间的转换问题。
核心能力:
将枚举的某个属性(如 code、value)与数据库字段绑定,而非默认的枚举名称(name())。
支持插入、更新、查询时自动转换。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
具体使用示例
(1) 定义枚举类
import com.baomidou.mybatisplus.annotation.EnumValue;public enum UserStatus {ENABLED(1, "启用"),DISABLED(0, "禁用");@EnumValue // 标记此属性对应数据库字段private final int code;private final String desc;UserStatus(int code, String desc) {this.code = code;this.desc = desc;}
}
(2) 实体类中使用枚举
public class User {private Long id;private String name;private UserStatus status; // 数据库字段自动映射为 code 值(1或0)
}
(3) 数据库表结构
CREATE TABLE user (id BIGINT PRIMARY KEY,name VARCHAR(50),status INT -- 存储枚举的 code 值(1或0)
);
(4) 实战操作
// 插入数据(数据库存 1)
userMapper.insert(new User().setStatus(UserStatus.ENABLED));// 查询(自动将 1 转换为 UserStatus.ENABLED)
User user = userMapper.selectById(1);
System.out.println(user.getStatus()); // 输出: ENABLED
核心规则:
@EnumValue 标记的枚举属性值 = 数据库存储值。
当然若使用lombok,可直接如下使用
@Getter
@AllArgsConstructor
public enum WithdrawManagementStatusEnum {PENDING_PAYMENT(0, "待支付"),PAID(1, "已支付"),;@EnumValueprivate final Integer code;private final String message;
}
此时在Java实体中
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class WithdrawManagementDTO implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "主键id", example = "6f24b689-3cdf-9c26-1487-ffb9f9f9f35a")private String id;@ApiModelProperty("提现申请时间")private LocalDateTime applyTime;@ApiModelProperty("账单开始时间")private LocalDateTime billingStartTime;@ApiModelProperty("账单结束时间")private LocalDateTime billingEndTime;@ApiModelProperty("提现状态(0-待支付,1-已支付)")private WithdrawManagementStatusEnum withdrawStatus;}