分析

在开发过程中,碰到枚举类型的字段,比如人的性别,用户的状态,订单的状态,我们往往在数据库层中使用数字 1、2等来存储数据。

在后端实体定义时,字段类型使用数字类型。使用这种方法,需要对前端传来的数据进行合法性校验,业务代码上比较啰嗦,所以使用枚举类来定义字段类型为更好的选择。

但是在一个实体类中使用枚举类型,有两个问题(如下图):

在这里插入图片描述

1、Controller层:序列化和反序列化的问题。前端传来的参数,如何反序列化构造这个实体,即如何构造实体中的这个枚举类字段(从数字转为枚举类型)。

2、DB层:后端使用的这个实体,如何保存到数据库中(从枚举类型转为数字),如何查询(数字转为枚举类型)。

常见的实体类中的类型String对应数据库中的varchar,boolean–>Integer(0,1)等等。不需要你进行任何配置,就可以插入成功,是因为有Mybaits内置的TypeHandler给自动转换。

但现在实体字段是枚举类,而数据库中是数字类型,Mybatis不认识你自定义的枚举类,不会自动转换,插入失败。

针对这两个问题,解决方法如下(该文仅提供思路分析,具体解决点链接):

Controller层方法

序列化:使用@JsonValue注解,完成枚举类型转为数字类型。

反序列化:使用@JsonCreator注解,完成数字类型转为枚举类型。

指定通过这个方法,构造枚举类实体,不再采用默认的空参构造,set赋值。

该方法示例:

	@JsonCreator
	public static GenderEnum forValue(Integer value) {
		GenderEnum [] values = GenderEnum .values();
		return Stream.of(values).filter(it -> it.getValue().equals(value)).findAny().orElse(null);
	}

详情:

https://blog.csdn.net/numbbe/article/details/119110754

DB层方法:

entity->db:直接插入数据库中数字。

db->entity:查出来就是 枚举类型。

由于内置的类型转换器不能满足我们的需求,所以需要自定义类型转换器,将我们自定义的枚举类型转为对应的数值存到数据库中。

详情:

https://blog.csdn.net/numbbe/article/details/119110852

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐