mybatis针对枚举的处理的总结
在 MyBatis 中,对枚举类型的处理可以通过以下几种方式:
一、默认处理
MyBatis 对枚举类型有一定的默认处理机制:
- 当数据库中的值与枚举的名称匹配时,MyBatis 可以自动将其转换为对应的枚举值。例如,如果数据库中有一个值为 “RED” 的字段,而枚举类型中有一个名为 “RED” 的枚举值,MyBatis 可以自动进行转换。
- 当数据库中的值与枚举的序数(即枚举值在定义中的位置,从 0 开始)匹配时,MyBatis 也可以进行自动转换。
二、使用类型处理器(TypeHandler)
-
自定义类型处理器:
- 可以创建自定义的类型处理器来处理枚举类型。例如,创建一个将枚举转换为数据库中的特定类型(如整数、字符串等)并反向转换的类型处理器。
- 这种方式可以根据具体的业务需求进行灵活的转换,例如将枚举值存储为特定的编码值或描述字符串。
-
在 MyBatis 配置中注册类型处理器:
- 在 MyBatis 的配置文件中,需要将自定义的类型处理器注册到配置中,以便 MyBatis 在进行数据库操作时能够使用该处理器。
三、使用 MyBatis-Plus 的注解
@EnumValue
注解:- 如果使用 MyBatis-Plus,可以使用
@EnumValue
注解来标识枚举中的一个字段,该字段的值将用于数据库存储和读取。 - 例如,可以在枚举类型中定义一个整数类型的字段,并使用
@EnumValue
注解标记该字段。在数据库操作中,MyBatis-Plus 会自动将该字段的值存储到数据库中,并在读取数据时根据该值转换回对应的枚举值。
- 如果使用 MyBatis-Plus,可以使用
四、JSON 序列化处理
- 在接口返回给前端时,如果包含枚举类型,可能需要对枚举进行 JSON 序列化处理:
- 可以使用 Jackson 的注解,如
@JsonFormat(shape = JsonFormat.Shape.STRING)
和@JsonValue
,来指定枚举在 JSON 序列化时的格式。例如,可以将枚举序列化为字符串类型,或者指定使用枚举中的特定方法返回的值进行序列化。 - 也可以创建自定义的序列化器,在序列化枚举时返回特定的格式,如枚举的序号或其他代表值。
- 可以使用 Jackson 的注解,如
总的来说,MyBatis 提供了多种方式来处理枚举类型,开发人员可以根据具体的业务需求和数据库设计选择合适的处理方式。在处理枚举类型时,需要考虑数据库存储的效率、数据的可读性以及与前端交互的便利性等因素。
代码实践:
统一拦截器对(EnumOrdinalTypeHandler)的处理:
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusPropertiesCustomizer;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.type.EnumOrdinalTypeHandler;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("com.nengliang.strategic.performance.mapper")
public class MybatisPlusConfig {
/**
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
@Bean
public MybatisPlusPropertiesCustomizer mybatisPlusPropertiesCustomizer() {
return properties -> {
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setDefaultEnumTypeHandler(EnumOrdinalTypeHandler.class);
configuration.setMapUnderscoreToCamelCase(true);
configuration.setCacheEnabled(true);
// configuration.setLogImpl(StdOutImpl.class);
properties.setConfiguration(configuration);
properties.setTypeEnumsPackage("com.nengliang.strategic.performance.enums");
};
}
}
枚举类:
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
@AllArgsConstructor
@JsonFormat(shape = JsonFormat.Shape.STRING)
public enum ApproveTaskStatusEnum {
// 审批状态:0-待审批,1-通过或驳回,2-无需审批 3-抄送我
WAIT(0, "待处理"),
FINISH(1, "已处理"),
AUTO(2, "无需处理"),
CC(3, "抄送我");
@EnumValue
private Integer code;
private String desc;
@JsonValue
public Integer getCode() {
return code;
}
public String getDesc() {
return desc;
}
public static ApproveTaskStatusEnum getEnumByValue(Integer value) {
for (ApproveTaskStatusEnum typeEnum : ApproveTaskStatusEnum.values()) {
if (typeEnum.code.equals(value)) {
return typeEnum;
}
}
return null;
}
}
实体类直接使用枚举,存入数据库的时候就是int类型,返回结果json序列化的时候也是int。