使用Spring Data JDBC 保存枚举值
使用Spring Data JDBC 保存枚举值
Spring Data JDBC在官方文档中提到,保存枚举类型时,默认使用枚举名称,即 Enum.name(),如何自定义保存枚举值呢?
本文将简单介绍Spring Data JDBC保存枚举类型字段的原理,并给出实现自定义保存枚举类型的解决方法。
引用Spring Data JDBC在官方文档
9.6.2. Supported Types in Your Entity
Enums get mapped to their name.
Spring Data JDBC保存枚举类型原理
Spring Data JDBC保存枚举类型时,使用的也是Spring的转换器Converter,具体使用的转换器是EnumToStringConverter
final class EnumToStringConverter extends AbstractConditionalEnumConverter implements Converter<Enum<?>, String> {
public EnumToStringConverter(ConversionService conversionService) {
super(conversionService);
}
@Override
public String convert(Enum<?> source) {
return source.name();
}
}
因为Spring Data JDBC在JdbcColumnTypes类中定义了默认的枚举转换类型,javaToDbType.put(Enum.class, String.class);,所以枚举类型都是EnumToStringConverter转换器。
public enum JdbcColumnTypes {
INSTANCE {
@SuppressWarnings({ "unchecked", "rawtypes" })
public Class<?> resolvePrimitiveType(Class<?> type) {
return javaToDbType.entrySet().stream() //
.filter(e -> e.getKey().isAssignableFrom(type)) //
.map(e -> (Class<?>) e.getValue()) //
.findFirst() //
.orElseGet(() -> (Class) ClassUtils.resolvePrimitiveIfNecessary(type));
}
};
private static final Map<Class<?>, Class<?>> javaToDbType = new LinkedHashMap<>();
static {
javaToDbType.put(Enum.class, String.class);
javaToDbType.put(ZonedDateTime.class, String.class);
javaToDbType.put(OffsetDateTime.class, OffsetDateTime.class);
javaToDbType.put(LocalDateTime.class, LocalDateTime.class);
javaToDbType.put(Temporal.class, Timestamp.class);
}
public abstract Class<?> resolvePrimitiveType(Class<?> type);
}
自定义保存枚举类型
通过前一章的介绍,要实现自定义保存枚举类型,只需要实现自定义的转换类型即可。
public enum StatusEnum {
CONNECT(0),
END(1);
public final int value;
StatusEnum(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
自定义转换器
@WritingConverter
public class StatusEnumToStringConverter implements Converter<StatusEnum, String> {
@Override
public String convert(StatusEnum source) {
return String.valueOf(source.getValue());
}
}
注册转换器
@Configuration
public class JdbcConfiguration extends AbstractJdbcConfiguration {
@NotNull
@Override
protected List<?> userConverters() {
return Arrays.asList(new StatusEnumToStringConverter());
}
}
需要注意的是,目前只能将枚举类型转换成字符串类型,这是因为Spring Data JDBC只把枚举类型映射成字符串类型。对于目前的主流数据库,如果数据表的字段是数值类型,会自动把字符串转成数值。也可以在定义表结构时,把该字段定义成字符类型。

464

被折叠的 条评论
为什么被折叠?



