MyBatisPlus通用枚举

2023-12-16 14:00:33

在实际开发中,可以将具有固定离散值的实体字段设置为枚举类型,对应数据库中可以设置为char(1) 类型,属性字段设置为对应的枚举类型。
如性别字段,一般固定为男和女两个值。

1 首先声明通用枚举属性

声明方式有两种:

  • 使用@EnumValue注解枚举属性
@Getter
public enum SexEnum {
    MALE(1, "男"),
    FEMALE(2, "女");

    @EnumValue
    private Integer code;
    private String desc;

    SexEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}
  • 枚举属性,实现 IEnum 接口
@AllArgsConstructor
public enum SexOtherEnum implements IEnum<Integer> {
    MALE(1, "男"),
    FEMALE(2, "女");

    private Integer code;
    private String desc;

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

2 配置扫描通用枚举

方式一:仅配置指定包内的枚举类使用 MybatisEnumTypeHandler

当添加这个配置后,mybatis-plus 提供的 MybatisSqlSessionFactoryBean 会自动扫描包内合法的枚举类(使用了 @EnumValue 注解,或者实现了 IEnum 接口),分别为这些类注册使用 MybatisEnumTypeHandler。

换句话说,只有指定包下的枚举类会使用新的 TypeHandler。其他包下,或者包内没有做相关改造的枚举类,仍然会使用 mybatis 的 DefaultEnumTypeHandler。
# mybatis-plus配置
mybatis-plus:
  # 配置扫描通用枚举,支持统配符 * 或者 ; 分割
  type-enums-package: com.giser.mybatisplus.enums

方式二:直接指定 DefaultEnumTypeHandler
此方式用来全局修改 mybatis 使用的 EnumTypeHandler。

配置文件 resources/application.yml

# mybatis-plus配置
mybatis-plus:
  configuration:
    default-enum-type-handler: org.apache.ibatis.type.EnumTypeHandler

自定义配置类 MybatisPlusAutoConfiguration

@Configuration
public class MybatisPlusAutoConfiguration {

    @Bean
    public MybatisPlusPropertiesCustomizer mybatisPlusPropertiesCustomizer() {
        return properties -> {
            GlobalConfig globalConfig = properties.getGlobalConfig();
            globalConfig.setBanner(false);
            MybatisConfiguration configuration = new MybatisConfiguration();
            configuration.setDefaultEnumTypeHandler(MybatisEnumTypeHandler.class);
            properties.setConfiguration(configuration);
        };
    }
}

3 属性字段使用枚举

@Data
@TableName("user")
public class User {
    @TableId
    private Long id;
	// 使用枚举
    private SexEnum sex;
}

4 测试

@Test
public void testSexEnum(){
  User user = new User();
  user.setName("Enum");
  user.setAge(20);
  //设置性别信息为枚举项,会将@EnumValue注解所标识的属性值存储到数据库
  user.setSex(SexEnum.MALE);
  //==>  Preparing: INSERT INTO user ( id, user_name, age, sex ) VALUES ( ?, ?, ?, ? )
  //==> Parameters: 1735182211109437441(Long), Enum(String), 20(Integer), 1(Integer)
  //<==    Updates: 1
  userMapper.insert(user);
}

5 如何序列化枚举值为前端返回值?

  • 在SpringBoot环境下
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer customizer(){
        return builder -> builder.featuresToEnable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
    }

jackson

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true);

然后重写toString()方法即可

文章来源:https://blog.csdn.net/SUNBOYmxbsH/article/details/135030825
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。