一、java枚举类编写
OperTypeCode.java
package com.imddy.nbigscreen.enums;
public enum OperTypeCode {
OPER_CC("OPER_CC", "出厂"),
OPER_RZ("OPER_RZ", "入站"),
OPER_ZC("OPER_ZC", "装车"),
OPER_FC("OPER_FC", "发车"),
OPER_DD("OPER_DD", "到达"),
OPER_XC("OPER_XC", "卸车"),
OPER_PSKS("OPER_PSKS", "配送开始"),
OPER_PSJS("OPER_PSJS", "配送结束");
private String code;
private String description;
OperTypeCode(String code, String description) {
this.code = code;
this.description = description;
}
public static OperTypeCode fromValue(String v) {
for (OperTypeCode c: OperTypeCode.values()) {
if (c.code.equals(v)) {
return c;
}
}
throw new IllegalArgumentException(v);
}
public String getCode() {
return code;
}
public String getDescription() {
return description;
}
}
OperateTypeEnum.java
package com.imddy.nbigscreen.enums;
public enum OperateTypeEnum {
公路干线(0, "公路干线"),
接车短驳(1, "接车短驳"),
铁路装车(2, "铁路装车"),
铁路卸车(3, "铁路卸车");
private Integer code;
private String description;
OperateTypeEnum(Integer code, String description) {
this.code = code;
this.description = description;
}
public static OperateTypeEnum fromValue(Integer v) {
for (OperateTypeEnum c: OperateTypeEnum.values()) {
if (c.code.equals(v)) {
return c;
}
}
throw new IllegalArgumentException(String.valueOf(v));
}
public Integer getCode() {
return code;
}
public String getDescription() {
return description;
}
}
直接的查看枚举对象和写入数据库
查看枚举对象直接toString输出:
把枚举对象通过jpa写入数据库:
说明:
1,枚举对象的toString为该枚举的名称;
2,枚举对象直接存储,就会保存该枚举的ORDINAL(可以理解成顺序号)。
二、前端展示(json格式化)
这里默认为jackson。
OperateTypeEnum.java
package com.imddy.nbigscreen.enums;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonValue;
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum OperateTypeEnum {
公路干线(0, "公路干线AAA"),
接车短驳(1, "接车短驳AAA"),
铁路装车(2, "铁路装车AAA"),
铁路卸车(3, "铁路卸车AAA");
private Integer code;
@JsonValue
private String description;
OperateTypeEnum(Integer code, String description) {
this.code = code;
this.description = description;
}
public static OperateTypeEnum fromValue(Integer v) {
for (OperateTypeEnum c: OperateTypeEnum.values()) {
if (c.code.equals(v)) {
return c;
}
}
throw new IllegalArgumentException(String.valueOf(v));
}
public Integer getCode() {
return code;
}
public String getDescription() {
return description;
}
}
在Enum枚举对象上添加了
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
已经在枚举属性上添加了
@JsonValue
前面按个接车短驳,是因为枚举对象名称就叫这个,后面这个接车短驳AAA,是因为又jsonValue这个注解,所以jackson格式化json时候就取他。
三、后端存储(存储到数据库)
这里默认先为jpa。
本章节介绍开发Spring Boot应用时使用JPA处理枚举类型持久化的三种方法:
一、使用 @Enumerated(EnumType.ORDINAL) 注解
使用 @Enumerated(EnumType.ORDINAL) 注解,存储枚举类型实例的定义顺序(从0开始递增),这也是JPA处理枚举类型的默认行为;
二、使用 @Enumerated(EnumType.STRING) 注解
使用 @Enumerated(EnumType.STRING) 注解,存储枚举类型实例的 name 属性,即 name() 方法返回值;
三、自定义实现 jakarta.persistence.AttributeConverter 接口的转换类
自定义实现 jakarta.persistence.AttributeConverter 接口的转换类:
convertToDatabaseColumn 方法将枚举转换成存储到数据库中的数据;
convertToEntityAttribute 方法将从数据库中查询到的数据转换成枚举。
// 作业类型编码
@Enumerated(EnumType.STRING)
@Basic
@Column(name = "oper_type_code")
private OperTypeCode operTypeCode;
// 作业时间
@Basic
@Column(name = "oper_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime operTime;
在jpa的entity中添加了@Enumerated(EnumType.STRING)注解,就会使用枚举的name。即
@Enumerated(EnumType.STRING)
特别注明:
在枚举中有个String字符串的code可以他可以和枚举名字对应。这样,保存时可以使用@Enumerated(EnumType.STRING)注解保存了注解的name。还可以再code属性上添加@jsonValue注解,这样在转成json时也是code他又和名字一一对应,我个人觉得算比较好的一种。
利用第三种情况编写代码如下:
创建converter包;
创建OperTypeCodeConverter转换类。
OperTypeCodeConverter.java
package com.imddy.tehuoexch.primary.converter;
import com.imddy.tehuoexch.sdk.enums.OperTypeCode;
import javax.persistence.AttributeConverter;
/**
* 实现数据库的枚举映射则需要自定义Convert类
*/
public class OperTypeCodeConverter implements AttributeConverter<OperTypeCode, String> {
@Override
public String convertToDatabaseColumn(OperTypeCode attribute) {
return attribute.getCode();
}
@Override
public OperTypeCode convertToEntityAttribute(String dbData) {
return OperTypeCode.fromValue(dbData);
}
}
在枚举类型属性上添加@Convert注解指定为我们自定义的注解类型。
// 作业类型编码
@Convert(converter = OperTypeCodeConverter.class)
@Basic
@Column(name = "oper_type_code")
private OperTypeCode operTypeCode;
// 作业时间
@Basic
@Column(name = "oper_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime operTime;
四、如果是mybatis。
MyBatis 可以映射 Java 枚举类型(Enum)。在 MyBatis 中,枚举类型的默认处理方式是通过 EnumTypeHandler
将枚举值转换为其名称进行存储。这意味着当一个枚举类型的字段被持久化到数据库时,默认情况下它会被保存为枚举名称。
如果你需要自定义枚举类型的处理方式,比如按照枚举的序号(ordinal)或者自定义的属性来存储和读取,你可以编写自定义的 TypeHandler
来实现这些功能:
- EnumOrdinalTypeHandler:MyBatis 提供了内置的
EnumOrdinalTypeHandler
,该处理器会将枚举的序号(从0开始的索引)与数据库中的数字字段进行映射。 - 自定义 TypeHandler:创建自己的
TypeHandler
实现类,指定如何将枚举类型与数据库中的特定类型(如 VARCHAR 或 INT)相互转换。
在映射文件中,你可以在 <resultMap>
或者 <parameterType>
的 <typeHandler>
标签下指定使用哪个枚举处理器,或者在全局配置中注册自定义的 TypeHandler
,使其对所有相应类型的枚举字段生效。
在MyBatis中支持枚举类型有两种常用的方法:
- 使用TypeHandler:自定义一个TypeHandler来处理枚举类型,实现TypeHandler接口,重写其方法,将枚举类型转换为数据库存储的类型和从数据库读取的类型转换为枚举类型。
示例代码如下:
public class MyEnumTypeHandler extends BaseTypeHandler<MyEnum> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, MyEnum parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter.getValue());
}
@Override
public MyEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
return MyEnum.fromValue(rs.getString(columnName));
}
@Override
public MyEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return MyEnum.fromValue(rs.getString(columnIndex));
}
@Override
public MyEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return MyEnum.fromValue(cs.getString(columnIndex));
}
}
在MyBatis的配置文件中注册TypeHandler:
<typeHandlers>
<typeHandler handler="com.example.MyEnumTypeHandler"/>
</typeHandlers>
- 使用EnumTypeHandler:MyBatis已经内置了EnumTypeHandler,可以直接使用该TypeHandler来处理枚举类型。
示例配置如下:
<resultMap id="resultMap" type="com.example.MyEntity">
<id column="id" property="id"/>
<result column="enumProperty" property="enumProperty" javaType="com.example.MyEnum" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
</resultMap>
以上是两种常用的方法来支持枚举类型在MyBatis中的使用,可以根据实际情况选择适合自己的方法。
五、如果Mybatis-plus。
Mybatis-plus除了上述外,还有一个特别的注解 @EnumValue。
就是数据库需要把枚举那个属性的值存入数据库,就把那个属性加上这个注解即可。