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; } }