Spring Boot Mybatis 使用枚举类

文章目录

  • Spring Boot Mybatis 使用枚举类
    • 为什么要使用枚举?
    • 如何引用

Spring Boot Mybatis 使用枚举类

记录一下,在实际项目引用枚举的步骤;

为什么要使用枚举?

可以参照以前我总结的博客:
为什么要使用枚举?

如何引用

需要创建以下文件:

文件 描述
<-- Interface --> IEnum
<-- class --> EnumKeyTypeHandler 继承 BaseTypeHandler的自定义枚举类
<-- class --> 实体Bean 数据库对应的PO,将需要用枚举表示的声明为Enum
<-- enum --> 枚举类 数据库对应的PO中需要用枚举表示的字段
<-- Mybatis.xml --> 对应数据库映射的xml 需要将用枚举表示的字段定义类型为自定义枚举类
  • IEnum
public interface IEnum {
    Object getKey();

    void setKey(int key);

    String getValue();

    void setValue(String value);
}
  • EnumKeyTypeHandler
public class EnumKeyTypeHandler extends BaseTypeHandler<IEnum> {

    private static Pattern NUMBER_PATTERN = Pattern.compile("^[-\\+]?[\\d]*$");

    private Class<IEnum> type;

    private final IEnum[] enums;

    /**
     * 设置配置文件设置的转换类以及枚举类内容,供其他方法更便捷高效的实现
     * @param type 配置文件中设置的转换类
     */
    public EnumKeyTypeHandler(Class<IEnum> type) {
        if (type == null) {
            throw new IllegalArgumentException("Type argument cannot be null");
        }

        this.type = type;
        this.enums = type.getEnumConstants();
        if (this.enums == null) {
            throw new IllegalArgumentException(type.getSimpleName() + " does not represent an enum type.");
        }
    }

    @Override
    public IEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
        if(isInteger(columnName)) {
            // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
            int i = rs.getInt(columnName);
            if (rs.wasNull()) {
                return null;
            } else {
                // 根据数据库中的code值,定位IEnum子类
                return locateIEnum(i);
            }
        } else {
            return locateIEnum(rs.getString(columnName));
        }
    }

    @Override
    public IEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
        int i = rs.getInt(columnIndex);
        if (rs.wasNull()) {
            return null;
        } else {
            // 根据数据库中的code值,定位IEnum子类
            return locateIEnum(i);
        }
    }

    @Override
    public IEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
        int i = cs.getInt(columnIndex);
        if (cs.wasNull()) {
            return null;
        } else {
            // 根据数据库中的code值,定位IEnum子类
            return locateIEnum(i);
        }
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, IEnum parameter, JdbcType jdbcType)
            throws SQLException {
        // baseTypeHandler已经帮我们做了parameter的null判断
        if(parameter.getKey() instanceof Integer) {
            ps.setInt(i, (Integer) parameter.getKey());
        } else
        if(parameter.getKey() instanceof String) {
            ps.setString(i, (String)parameter.getKey());
        }
    }

    /**
     * 枚举类型转换,由于构造函数获取了枚举的子类enums,让遍历更加高效快捷
     * @param key 数据库中存储的自定义code属性
     * @return code对应的枚举类
     */
    private IEnum locateIEnum(Object key) {
        for(IEnum status : enums) {
            if(status.getKey() instanceof Integer) {
                if((Integer)status.getKey()== key) {
                    return status;
                }
            } else
            if(status.getKey() instanceof String) {
                if(status.getKey().toString().equals(key)) {
                    return status;
                }
            }

        }
        throw new IllegalArgumentException("未知的枚举类型:" + key + ",请核对" + type.getSimpleName());
    }

    /*
     * 判断是否为整数
     * @param str 传入的字符串
     * @return 是整数返回true,否则返回false
     */

    public static boolean isInteger(String str) {
        return NUMBER_PATTERN.matcher(str).matches();
    }
}
  • 实体Bean
public class Company implements Serializable {


    private static final long serialVersionUID = -1505541566786459102L;

    private Integer cId;

	...
	...
	...

	// 改为枚举类型
    private CompanyStatusEnum status;
    ...
    ...
}
  • *Enum.java
public enum CompanyStatusEnum implements IEnum {

    SUBSISTING("subsisting","存续"),

    EMPLOYED("employed","在业"),

    REVOKE("revoke","吊销"),

    ANNUL("annul","注销"),

    MOVING("moving","迁入"),

    EMIGRATION("emigration","迁出"),

    SHUTOUT("shutout","停业"),

    LIQUIDATE("liquidate","清算");

    private final String key;

    private final String value;

    private CompanyStatusEnum (String key,String value){
        this.key = key;
        this.value = value;
    }

    /**
     * 根据key获取枚举
     * @param key
     * @return
     */
    public static CompanyStatusEnum getEnumByKey(String key){
        if(null == key){
            return null;
        }
        for(CompanyStatusEnum temp:CompanyStatusEnum.values()){
            if(temp.getKey().equals(key)){
                return temp;
            }
        }
        return null;
    }

    @Override
    public String getKey() {
        return key;
    }

    @Override
    public void setKey(int key) {

    }

    @Override
    public String getValue() {
        return value;
    }

    @Override
    public void setValue(String value) {

    }

}
  • *Mapper.xml
....
...
<mapper namespace="com.bdjr.data.process.mapper.CompanyMapper" >
    <resultMap id="BaseResultMap" type="com.spring.cloud.common.po.Company">
        <id column="c_id" jdbcType="BIGINT" property="cId" />
        ...
        ...
        
        <result column="status" jdbcType="VARCHAR" typeHandler="com.spring.cloud.common.typehandler.EnumKeyTypeHandler" property="status" />
    resultMap>
    ...
    ...
mapper>

你可能感兴趣的:(技术总结,Java,弗兰克与Spring,Framework)