写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!

这个通用枚举太简单了,本想不单独整理一篇博客了,闲着也是闲着,整理下吧,废话不多说,先简单说下通用枚举的使用步骤:

  1. t_user表中新增字段sex
  2. 对于枚举类的处理有两种方式:1): implements IEnum<Integer> 2): @EnumValue(标记数据库的值) 本篇使用第二章注解的方式
  3. 配置扫描枚举类的路径(type-enums-package)

定义枚举类:

@Getter
public enum SexEnum {

    MAN(1,"男"),
    WOMAN(2,"女");

    @EnumValue
    private int code;
    private String value;

    SexEnum(Integer code, String value){
        this.code = code;
        this.value = value;
    }

}

说一下上面的@EnumValue注解,@EnumValue用来标记数据库存的值  mybatis原生默认是以枚举的名称: Enum.name()作为默认值,即User类中定义的属性 private SexEnum sex; 默认向数据库存的时候会将SexEnum.MAN.name()的值存入数据库(String类型),使用@EnumValue注解标识SexEnum类中的code属性后,保存数据库时就会取值code保存进数据库。同样如果标识value 保存时会取value的值(男/女)保存入库。

贴一下最新的User类:

@Data
@TableName(value = "t_user")
public class User {

    @TableId(value = "user_id",type = IdType.AUTO)
    private Integer userId;
    private String userName;
    private Integer age;
    private SexEnum sex;

}

配置扫描枚举类路径,配置文件中追加配置type-enums-package: com.example.springbootmp.domain.enums:

mybatis-plus:
  mapper-locations: classpath:mybatis/*.xml #指定xml路径
  configuration:
    # sql输出到控制台  方便查看
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  type-enums-package: com.example.springbootmp.domain.enums

好了,通用枚举的使用是不是很简单,测试下:

新建EnumTest测试类,先测试一下insert操作,如下:

@Test
    public void aInsert() {
        User user = new User();
        user.setUserName("xiaohua");
        user.setAge(18);
        user.setSex(SexEnum.WOMAN);
        userMapper.insert(user);
    }

我们期望将SexEnum.WOMAN的code值,也就是2保存到数据库,看下执行测试方法后数据库:

android 注解枚举 springboot枚举类注入_数据库

更新就不测试了,跟insert是一样的,测试下查询吧:

@Test
    public void bSelect() {
        LambdaQueryWrapper<User> wrapper = new QueryWrapper<User>().lambda().eq(User::getSex,
                SexEnum.WOMAN);
        List<User> userList = userMapper.selectList(wrapper);
        System.out.println(userList);
    }

我们期望查询出来的sex是枚举类型,而不是数字,执行结果:

android 注解枚举 springboot枚举类注入_枚举类_02

最后测试下删除:

@Test
    public void cDelete() {
        LambdaQueryWrapper<User> wrapper = new QueryWrapper<User>().lambda().eq(User::getSex,
                SexEnum.WOMAN);
        userMapper.delete(wrapper);
    }

执行后看看数据库的数据是否删除了,执行结果:

android 注解枚举 springboot枚举类注入_数据库_03

完毕!

补充:如果数据库中有两条数据:性别中一条存的2,一条存的是女(当然这种情况正常是不会存在的)。
1. 在查询时,不会报错,而只是查询到了一条匹配的数据
2. 在删除时,会报错(Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: '女')