springboot+mybatis统一枚举自定义处理器

mybatis统一枚举自定义处理器

  • 使用场景:
    mybatis自带的枚举处理器是name和ordinal两种处理器
    当需要下列枚举的value为数据库的值时,则不满足:
public enum BlogStatusEnum {

    DRAFT(1, "草稿"),
    RELEASED(2, "已发布"),
    DELETED(3, "已删除");

    private final Integer value;
    private final String remark;

    BlogStatusEnum(Integer value, String remark) {
        this.value = value;
        this.remark = remark;
    }
    
	public Integer getValue() {
        return value;
    }

    public String getRemark() {
        return remark;
    }
}

自定义枚举处理器开始

  • 1 枚举类的处理
public enum BlogStatusEnum {

    DRAFT(1, "草稿"),
    RELEASED(2, "已发布"),
    DELETED(3, "已删除");

    private final Integer value;
    private final String remark;

    BlogStatusEnum(Integer value, String remark) {
        this.value = value;
        this.remark = remark;
    }
    
	public Integer getValue() {
        return value;
    }

    public String getRemark() {
        return remark;
    }

	/**
     * 根据指定的值获取枚举对象
     */
    public static BlogStatusEnum get(Integer value) {
        for (BlogStatusEnum blogStatusEnum : BlogStatusEnum.values()) {
            if (blogStatusEnum.getValue() == value) {
                return blogStatusEnum;
            }
        }
        return null;
    }

	/**
     * 获取当前枚举的value值
     */
    @Override
    public String toString() {
        return String.valueOf(this.value);
    }
}
  • 2 创建自定义处理器,复制修改于源码 org.apache.ibatis.type.EnumTypeHandler
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.springframework.util.StringUtils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 自定义枚举转换器类型
 */
public class MyEnumTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {
    private final Class<E> type;

    public MyEnumTypeHandler(Class<E> type) {
        if (type == null) {
            throw new IllegalArgumentException("Type argument cannot be null");
        } else {
            this.type = type;
        }
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
    	//使用toString方法来进行值的设置,需重写枚举的toString方法
        if (jdbcType == null) {
            ps.setString(i, parameter.toString());
        } else {
            ps.setObject(i, parameter.toString(), jdbcType.TYPE_CODE);
        }
    }

    @Override
    public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return get(rs.getString(columnName));
    }

    @Override
    public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return get(rs.getString(columnIndex));
    }

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

    /**
     * 根据value获取枚举对象
     *
     * @param v
     * @param 
     * @return
     */
    private <E extends Enum<E>> E get(String v) {
        if (v == null) return null;
        if (!StringUtils.isEmpty(v)) {
            Method method = null;
            try {
                method = type.getMethod("get", Integer.class);
                return (E) method.invoke(type, Integer.parseInt(v));
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
            return null;
        } else {
            return null;
        }
    }
}
  • 3 指定枚举处理器 application.properties
# 自定义枚举处理类
mybatis.configuration.default-enum-type-handler=com.xxx.xxx.MyEnumTypeHandler

自定义枚举处理器结束

就可以在实体类中使用枚举,进行正常的使用,数据库存储的是枚举的value值,读取出来的是枚举对象

你可能感兴趣的:(mybatis,java,mybatis)