当前位置: > > > SpringBoot - MyBatis-Plus使用详解15(通用枚举)

SpringBoot - MyBatis-Plus使用详解15(通用枚举)

十五、通用枚举

1,问题描述

(1)项目中我们通常会定义一些枚举,比如下面定义了一个性别枚举:
@Getter
public enum GenderEnum {
    MALE(1, "男"),
    FEMALE(2, "女");

    private final int code;
    private final String descp;

    GenderEnum(final int code, final String descp) {
        this.code = code;
        this.descp = descp;
    }
}

(2)然后定义用户实体时,使用这个枚举类型:
@Data
public class UserInfo {
    private Integer id;
    private String userName;
    private String passWord;
    private Integer age;
    private GenderEnum gender;
}

(3)最后我们实例化这个实体类,并插入到数据库中:
// 添加第1个用户
UserInfo user1 = new UserInfo();
user1.setUserName("hangge");
user1.setPassWord("123");
user1.setGender(GenderEnum.MALE);
userInfoMapper.insert(user1);

// 添加第2个用户
UserInfo user2 = new UserInfo();
user2.setUserName("kitty");
user2.setPassWord("11");
user2.setGender(GenderEnum.FEMALE);
userInfoMapper.insert(user2);

(4)查看数据库,可以发现 mybatis原生默认是以枚举的名称 Enum.name()作为默认值(即 GenderEnum.MALE.name() 和 GenderEnum.FEMALE.name())。这样就要求对应数据库的字段必须是一个varchar类型,这显然不太合适。

2,解决办法

(1)Mybatis-Plus的通用枚举处理,增强了原生的枚举处理,让匹配的数据可以自由定制。比如这个枚举值对应的数据库字段类型是int(1),即最终存入数据是如下形式:

(2)首先我们在 application.properties 文件中配置扫描枚举类的路径:
mybatis-plus.type-enums-package=com.example.demo.enums

(3)接着让枚举实现IEnum接口,通过getValue()方法,告诉Mybatis-Plus,枚举类的真正的value是什么,这样就实现了自由定制。
@Getter
public enum GenderEnum implements IEnum<Integer> {
    MALE(1, "男"),
    FEMALE(2, "女");

    private final int code;
    private final String descp;

    GenderEnum(final int code, final String descp) {
        this.code = code;
        this.descp = descp;
    }

    @Override
    public Integer getValue() {
        return code;
    }
}

  • 还有更简单的方式,不用实现IEnum接口,直接使用@EnumValue注解标注出真正的value是什么,效果同上面是一样的:
@Getter
public enum GenderEnum{
    MALE(1, "男"),
    FEMALE(2, "女");

    @EnumValue
    private final int code;
    private final String descp;

    GenderEnum(final int code, final String descp) {
        this.code = code;
        this.descp = descp;
    }
}
评论0