通用枚举

例如在我们的User类中有这样一个字段 status 来表示用户的状态:

public class User {
    private String name;

    private String password;

    /**
     * 账户状态(0:正常,1:锁定)
     */
    private Integer status;
}

像这种字段我们通常会定义一个枚举类,在做业务判断的时候就可以基于枚举进行比较。

@Getter
public enum UserStatus {
    ENABLED(1, "正常"),
    DISABLED(0, "锁定");

    private Integer value;
    private String desc;

    UserStatus(int i, String desc) {
        this.value = i;
        this.desc = this.name();
    }
}

但是我们数据库存储该字段采用的是int类型,对应的 PO 是Integer。因此业务操作时必须手动把枚举与Integer转换,非常麻烦。

因此,MybatisPlus 提供了一个处理枚举的类型转换器,可以帮助我们把枚举类型与数据库类型自动转换,

枚举类型的默认行为是序列化为其名称。但是在数据库操作中,我们通常需要存储枚举的一个特定数值而非名称。MybatisPlus 通过使用 @EnumValue 注解允许我们设定枚举值与数据库中实际存储的值之间的映射。这样,当从数据库读取或向数据库写入枚举类型的字段时,MybatisPlus 能够自动处理这种类型转换。

例如,如果我们有以下的枚举定义:

@Getter
public enum UserStatus {
    ENABLED(1, "正常"),
    DISABLED(0, "锁定");
    
    @EnumValue
    private Integer value;
    private String desc;

    UserStatus(int i, String desc) {
        this.value = i;
        this.desc = this.name();
    }
};

通过在枚举的字段上使用 @EnumValue 注解,MybatisPlus 知道在与数据库交互时应该使用枚举的 value 字段值。

同时,要确保当枚举值通过JSON形式展示给前端时,展示的是枚举的名称而不是数据库中的数字,我们可以在枚举字段上使用 @JsonValue 注解:

@Getter
public enum UserStatus {
    ENABLED(1, "正常"),
    DISABLED(0, "锁定");
    
    @EnumValue
    private Integer value;
    @JsonValue
    private String desc;

    UserStatus(int i, String desc) {
        this.value = i;
        this.desc = this.name();
    }
};

这样,不论是在与数据库交互还是在JSON序列化时,都能确保枚举值的正确表示和使用。

最后更新于

这有帮助吗?