将数据库中的值处理成Java实体类中的枚举类型


一、数据库中的数据

如图所示:
在这里插入图片描述
我们可知数据库中的一张表对应Java中的一个实体类,其中数据库中的字段对应实体类中的属性。在数据库中设置staff_state字段为varchar类型,但对应到Java中的实体类的属性为枚举类型,将如何进行转换?

二、实体类

代码如下(示例):

public class Staff {
	private int staffId; // 工号
	private String staffName; // 姓名
	private String contactPhoneNumber; // 联系电话
	private StaffState staffState; // 状态:离职或在职
	
	public int getStaffId() {
		return staffId;
	}

	public void setStaffId(int staffId) {
		this.staffId = staffId;
	}

	public String getStaffName() {
		return staffName;
	}

	public void setStaffName(String staffName) {
		this.staffName = staffName;
	}

	public String getContactPhoneNumber() {
		return contactPhoneNumber;
	}

	public void setContactPhoneNumber(String contactPhoneNumber) {
		this.contactPhoneNumber = contactPhoneNumber;
	}

	public StaffState getStaffState() {
		return staffState;
	}

	public void setStaffState(StaffState staffState) {
		this.staffState = staffState;
	}
	
	@Override
	public String toString() {
		return "Staff [staffId=" + staffId + ", staffName=" + staffName + ", contactPhoneNumber=" + contactPhoneNumber
				+ ", staffState=" + staffState + "]";
	}
}

StaffState枚举类

public enum StaffState {
	LEAVE_JOB("离职"), ON_JOB("在职");

	private String statusVal;

	// 设置任职状态(中文)
	private StaffState(String statusVal) {
		this.statusVal = statusVal;

	}

	public String getStatusVal() {
		return statusVal;
	}

	public void setStatusVal(String statusVal) {
		this.statusVal = statusVal;
	}

	// 将从从数据库中获取的值,转换成枚举值
	public static StaffState getStaffStateByVal(String stateVal) {
		switch (stateVal) {
		case "离职":
			return StaffState.LEAVE_JOB;
		case "在职":
			return StaffState.ON_JOB;
		}
		return StaffState.ON_JOB;
	}
}

将在职状态设置为枚举类型是为了增强代码的可读性以及避免传参中出现错误。

三、处理过程

  1. 在枚举类型中创建有参构造,将所保存的中文对应枚举值
  2. getStaffStateByVal()方法:手动将数据库中的中文值和枚举值做对应
  3. 须重写BaseTypeHandle中的四个方法
  4. 避免每次遇到此枚举值的转换,可在主配置文件中设置typeHandler

重写BaseTypeHandle类中的四个方法

	// 处理StaffState的Handle
	public class StaffStateHandle extends BaseTypeHandler<StaffState> {

		@Override
		public void setNonNullParameter(PreparedStatement ps, int i, StaffState parameter, JdbcType jdbcType)
			throws SQLException {
		// 将枚举值转换成状态值(中文)
		// 通过getStateVal()方法获取枚举对应的中文值
		ps.setString(i, parameter.getStatusVal());
	}

	@Override
	public StaffState getNullableResult(ResultSet rs, String columnName) throws SQLException {
		// 通过在枚举中的转换方法将(中文)转换成枚举型
		// 通过列表的名称获取值
		return StaffState.getStaffStateByVal(rs.getString(columnName));
	}

	@Override
	public StaffState getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
		// 同上述
		// 通过下标获取相应的值
		return StaffState.getStaffStateByVal(rs.getString(columnIndex));
	}

	@Override
	public StaffState getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
		return StaffState.getStaffStateByVal(cs.getString(columnIndex));
	}

}

主配置文件设置typeHandler

<typeHandlers>
		<!-- 处理枚举类型StaffState -->
		<typeHandler handler="com.amanda.drp.dao.handle.StaffStateHandle" javaType="com.amanda.drp.entity.StaffState" />
	</typeHandlers>


版权声明:本文为qq_55135629原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。