实体类status属性使用枚举类型的步骤

1. 问题引出

当实体类的状态属性为Integer类型时,容易写错

2. 初步修改

把状态属性强制为某个类型,并且自定义一些可供选择的常量。

java 复制代码
public class LessonStatus {

    public static final LessonStatus NOT_LEARNED = new LessonStatus(0,"未学习");
    public static final LessonStatus LEARNING = new LessonStatus(1,"学习中");
    public static final LessonStatus FINISHED = new LessonStatus(2,"已学完");
    public static final LessonStatus INVALID = new LessonStatus(3,"已失效");

    private int value;
    private String desc;

    private LessonStatus(int value, String desc){
        this.value=value;
        this.desc=desc;
    }
}

在java1.4过后,可以用enum类型代替以上写法

java 复制代码
public enum LessonStatus {

    NOT_LEARNED(0,"未学习"),
    LEARNING(1,"学习中"),
    FINISHED(2,"已学完"),
    INVALID(3,"已失效");

    private int value;
    private String desc;
    LessonStatus(int value,String desc){
        this.value = value;
        this.desc = desc;
    }
}

使用该类型

3. @EnumValue

但是这样做,将数据插入表时会产生类型不匹配的问题。实体类为enum类型,表的列属性为tinyint类型。

因此,给需要注入值的字段加上@EnumValue注解,表示插入数据库时,实际上插入的是该字段而不是整个枚举对象。

再次测试,成功

4. 使用案例

@JsonValue :与@EnumValue相似,转换成json对象时,只序列化该注解下的字段
@JsonCreator:json反序列化,将该字段转换成一个object对象

java 复制代码
@Getter
public enum LessonStatus implements BaseEnum {
    NOT_BEGIN(0, "未学习"),
    LEARNING(1, "学习中"),
    FINISHED(2, "已学完"),
    EXPIRED(3, "已过期"),
    ;
    @JsonValue
    @EnumValue
    int value;
    String desc;

    LessonStatus(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }

    @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
    public static LessonStatus of(Integer value){
        if (value == null) {
            return null;
        }
        for (LessonStatus status : values()) {
            if (status.equalsValue(value)) {
                return status;
            }
        }
        return null;
    }
}
java 复制代码
@Getter
public enum PlanStatus implements BaseEnum {
    NO_PLAN(0, "没有计划"),
    PLAN_RUNNING(1, "计划进行中"),
    ;
    @JsonValue
    @EnumValue
    int value;
    String desc;

    PlanStatus(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }


    @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
    public static PlanStatus of(Integer value){
        if (value == null) {
            return null;
        }
        for (PlanStatus status : values()) {
            if (status.equalsValue(value)) {
                return status;
            }
        }
        return null;
    }
}

json序列化见下一篇博客@JsonValue和@JsonCreator使用

相关推荐
changshuaihua00118 分钟前
Redis 详解:Redis 与 MySQL 的区别、数据类型与缓存三大问题
数据库·redis·缓存
qetfw27 分钟前
Debian 配置 AIDE 文件完整性检测:基线初始化、变更检查与数据库更新
linux·网络·数据库·debian
Elastic 中国社区官方博客41 分钟前
Elasticsearch:搜索教程 - 语义搜索(三)
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
随风M记忆s2 小时前
Redis支持事务吗?了解Redis的持久化机制吗?
数据库·redis·bootstrap
花青泽4 小时前
5-数据库-SQL注入-联合查询-关键字绕过-day13
数据库·sql
天桥下的卖艺者10 小时前
使用scitable包,两步生成逆概率删失权重(IPCW)
数据库·r语言
隔窗听雨眠10 小时前
AI原生数据库浪潮:国产数据库的架构重构与路径之争
数据库
数据库小学妹10 小时前
数据库选型实战:从数据类型到TCO成本,五维决策框架+九款产品横评
数据库·信创·国产数据库·数据库选型·oracle迁移
神龙天舞200111 小时前
MySQL 备库为什么会延迟好几个小时
android·数据库·mysql
丙氨酸長鏈13 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库