自定义枚举的应用
参考:https://segmentfault.com/a/1190000010755321
一:场景,
1 OPEN(10), //开启 2 CLOSE(11), //关闭 3 OFF_LINE(12), //离线 4 FAULT(200), //故障 5 UNKNOWN(255); //未知
来代表5种状态。
前台传入的是OPEN 。然后数据库中保存的是10.(插入)
数据库中查询到的是10.输出的是OPEN (查询)
一:1)实体类
package com.ssm.bean; import com.ssm.enums.ComputerState; public class Process { private Integer id; private String name; private ComputerState status; //是一个枚举类 类型 public Process() { } public Process(Integer id, String name, ComputerState status) { this.id = id; this.name = name; this.status = status; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public ComputerState getStatus() { return status; } public void setStatus(ComputerState status) { this.status = status; } @Override public String toString() { return "Process{" + "id=" + id + ", name='" + name + '\'' + ", status=" + status + '}'; } }
2):写一个 ComputerState 枚举类:
package com.ssm.enums; public enum ComputerState implements BaseCodeEnum{ OPEN(10), //开启 CLOSE(11), //关闭 OFF_LINE(12), //离线 FAULT(200), //故障 UNKNOWN(255); //未知 private int code; ComputerState(int code) { this.code = code; } @Override public int getCode() { return this.code; } }
3):实现的BaseCodeEnum枚举类。
/** * 接口只有一个返回编码的方法,返回值将被存入数据库。 */ public interface BaseCodeEnum { int getCode(); }
4):自定义CodeEnumTypeHandler 转换器。
package com.ssm.enums; import com.ssm.utils.CodeEnumUtil; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class CodeEnumTypeHandler<E extends Enum<?> & BaseCodeEnum> extends BaseTypeHandler<BaseCodeEnum> { private Class<E> type; public CodeEnumTypeHandler(Class<E> type) { if (type == null) { throw new IllegalArgumentException("Type argument cannot be null"); } this.type = type; } /** * 用于定义设置参数时,该如何把Java类型的参数转换为对应的数据库类型 * 保存的时候,传入的是:ComputerState.OPEN 保存到数据库的是:10 * @param ps * @param i * @param parameter * @param jdbcType * @throws SQLException */ @Override public void setNonNullParameter(PreparedStatement ps, int i, BaseCodeEnum parameter, JdbcType jdbcType) throws SQLException { ps.setInt(i, parameter.getCode()); } /** * 用于定义通过字段名称获取字段数据时,如何把数据库类型转换为对应的Java类型 * * 数据库中是10 输出的值是:OPEN * @param rs * @param columnName * @return * @throws SQLException */ @Override public BaseCodeEnum getNullableResult(ResultSet rs, String columnName) throws SQLException { int code = rs.getInt(columnName); return rs.wasNull() ? null : codeOf(code); } /** * 用于定义通过字段索引获取字段数据时,如何把数据库类型转换为对应的Java类型 * 这个是通过字段的索引的。还没有测出来怎么使用。 * @param rs * @param columnIndex * @return * @throws SQLException */ @Override public BaseCodeEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException { /* int code = rs.getInt(columnIndex); return rs.wasNull() ? null : codeOf(code);*/ return null; } /** * 用定义调用存储过程后,如何把数据库类型转换为对应的Java类型 * @param cs * @param columnIndex * @return * @throws SQLException */ @Override public BaseCodeEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { /*int code = cs.getInt(columnIndex); return cs.wasNull() ? null : codeOf(code);*/ return null; } private E codeOf(int code){ try { return CodeEnumUtil.codeOf(type, code); } catch (Exception ex) { throw new IllegalArgumentException("Cannot convert " + code + " to " + type.getSimpleName() + " by code value.", ex); } } }
5):在mybatis-config.xml中配置
<!--使用枚举类。从数据库中查询的是10,转换成枚举类里的OPEN(查询)。传递是:OPEN 保存到数据库中是:10(保存) --> <typeHandlers> <typeHandler handler="com.ssm.enums.CodeEnumTypeHandler" javaType="com.ssm.enums.ComputerState"/> </typeHandlers>