前言
在开发过程中,我们经常需要将从数据库获取的字符串或数字转换为更具语义的枚举类型。这不仅可以提高代码的可读性,还可以确保类型安全。这时候我们从数据库查出来的值如何通过枚举转换返回?
1. 构建枚举类型
首先,我们需要定义一个枚举类型来存储业务相关的常量。这些常量通常会包含一个描述性的字符串和一个可以与数据库中存储的值相匹配的标识符。
示例枚举类型:
public enum StatusEnum {
ACTIVE(1, "Active"),
INACTIVE(2, "Inactive"),
DELETED(3, "Deleted");
private Integer value;
private String description;
StatusEnum(Integer value, String description) {
this.value = value;
this.description = description;
}
public Integer getValue() {
return value;
}
public String getDescription() {
return description;
}
public static String getDescriptionByValue(Integer value) {
for (StatusEnum status : StatusEnum.values()) {
if (status.getValue().equals(value)) {
return status.getDescription();
}
}
return null; // 或者抛出异常,根据需求而定
}
}
2. 创建实体类
接下来,创建一个实体类(VO),该类用于展示数据,并包含一个方法用于将数据库查询结果转换为枚举类型。
示例实体类:
import io.swagger.annotations.ApiModelProperty;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
public class DataStatusVO {
@ApiModelProperty("序列号")
private String serialNumber;
@ApiModelProperty("状态")
private String status;
@ApiModelProperty("日期")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date date;
public void setStatus(String status) {
this.status = StatusEnum.getDescriptionByValue(Integer.parseInt(status));
}
// Getters and Setters
}
3. 使用实体类
当从数据库查询到数据后,可以通过调用setStatus
方法将字符串类型的status
转换为枚举类型中的描述。
示例使用:
public class DataService {
public DataStatusVO getDataFromDB() {
// 假设从数据库获取的数据如下
String serialNumber = "SN12345";
String status = "1"; // 数据库中存储的状态标识符
Date date = new Date();
DataStatusVO dataStatusVO = new DataStatusVO();
dataStatusVO.setSerialNumber(serialNumber);
dataStatusVO.setStatus(status); // 这里会自动转换为"Active"
dataStatusVO.setDate(date);
return dataStatusVO;
}
}
注意事项
- 当数据库中的值与枚举中的值不匹配时,
getDescriptionByValue
方法可能会返回null
。因此,在调用setStatus
方法之前,最好进行适当的错误处理。 - 如果枚举值和数据库值之间存在多对一的关系,可以在枚举中添加额外逻辑来处理这种情况。
- 考虑使用异常处理机制来替代返回
null
,以避免在后续代码中出现空指针异常。