使用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只把枚举类型映射成字符串类型。对于目前的主流数据库,如果数据表的字段是数值类型,会自动把字符串转成数值。也可以在定义表结构时,把该字段定义成字符类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值