为了账号安全,请及时绑定邮箱和手机立即绑定

Mybatis TypeHandler 的使用

标签:
Java

1,枚举类

public enum GenderEnum implements CodeDescEnum {
    /**
     * 0未知,1男,2女
     */
    UNKNOWN(0, "未知"),
    MALE(1, "男"),
    FEMALE(2, "女");

    private Integer code;
    private String desc;

    GenderEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    @Override
    public String getDesc() {
        return desc;
    }

    @Override
    public Integer getCode() {
        return code;
    }
}

2,编写Hanlder 继承CodeIdentifyEnumHandler

public class GenderEnumHandler extends CodeIdentifyEnumHandler<GenderEnum> {
    public GenderEnumHandler() {
        super(GenderEnum.class);
    }
}

3,CodeIdentifyEnumHandler

public abstract class CodeIdentifyEnumHandler<T extends Enum<T> & CodeDescEnum> extends BaseTypeHandler<T> {

    private Class<T> type;

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


    @Override
    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return CodeDescEnum.getFromCodeOrThrow(type, rs.getInt(columnName));
    }

    @Override
    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return CodeDescEnum.getFromCodeOrThrow(type, rs.getInt(columnIndex));
    }

    @Override
    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return CodeDescEnum.getFromCodeOrThrow(type, cs.getInt(columnIndex));
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
        ps.setInt(i, parameter.getCode());
    }
}


4 , 看一下CodeDescEnum

public interface CodeDescEnum {
    Map<Class, Map<String, CodeDescEnum>> descEnumCache = new HashMap<>();
    Map<Class, Map<Integer, CodeDescEnum>> codeEnumCache = new HashMap<>();

    @SuppressWarnings(value = {"unchecked"})
    static <Y extends CodeDescEnum> Optional<Y> getFromDescOpt(Class<Y> clazz, String desc) {
        Map<String, CodeDescEnum> clazzEnumMap = descEnumCache.get(clazz);

        // 初始化enumMap
        if (clazzEnumMap == null) {
            clazzEnumMap = new HashMap<>();

            for (Y type : clazz.getEnumConstants()) {
                clazzEnumMap.put(type.getDesc(), type);
            }
            descEnumCache.put(clazz, clazzEnumMap);
        }

        return Optional.ofNullable((Y) clazzEnumMap.get(desc));
    }

    @SuppressWarnings(value = {"unchecked"})
    static <T extends CodeDescEnum> T getFromDescOrNull(Class<T> clazz, String desc) {
        Optional<? extends CodeDescEnum> codeIdentifyEnumOpt = getFromDescOpt(clazz, desc);
        return (T) codeIdentifyEnumOpt.orElse(null);
    }

    @SuppressWarnings(value = {"unchecked"})
    static <T extends CodeDescEnum> T getFromDescOrThrow(Class<T> clazz, String desc) {
        Optional<? extends CodeDescEnum> codeIdentifyEnumOpt = getFromDescOpt(clazz, desc);
        if (codeIdentifyEnumOpt.isPresent()) {
            return (T) codeIdentifyEnumOpt.get();
        }
        throw new CommonException(CommonErrorCode.UNKNOWN_ERROR, "不存在的" + clazz.getSimpleName() + "类型", "不存在的" + clazz.getSimpleName() + "类型desc=" + desc);
    }


    @SuppressWarnings(value = {"unchecked"})
    static <Y extends CodeDescEnum> Optional<Y> getFromCodeOpt(Class<Y> clazz, Integer code) {
        Map<Integer, CodeDescEnum> clazzEnumMap = codeEnumCache.get(clazz);

        // 初始化enumMap
        if (clazzEnumMap == null) {
            clazzEnumMap = new HashMap<>();

            for (Y type : clazz.getEnumConstants()) {
                clazzEnumMap.put(type.getCode(), type);
            }
            codeEnumCache.put(clazz, clazzEnumMap);
        }

        return Optional.ofNullable((Y) clazzEnumMap.get(code));
    }

    @SuppressWarnings(value = {"unchecked"})
    static <T extends CodeDescEnum> T getFromCodeOrNull(Class<T> clazz, Integer code) {
        Optional<? extends CodeDescEnum> codeIdentifyEnumOpt = getFromCodeOpt(clazz, code);
        return (T) codeIdentifyEnumOpt.orElse(null);
    }

    @SuppressWarnings(value = {"unchecked"})
    static <T extends CodeDescEnum> T getFromCodeOrThrow(Class<T> clazz, Integer code) {
        Optional<? extends CodeDescEnum> codeIdentifyEnumOpt = getFromCodeOpt(clazz, code);
        if (codeIdentifyEnumOpt.isPresent()) {
            return (T) codeIdentifyEnumOpt.get();
        }
        throw new CommonException(CommonErrorCode.UNKNOWN_ERROR, "不存在的" + clazz.getSimpleName() + "类型", "不存在的" + clazz.getSimpleName() + "类型code=" + code);
    }

    String getDesc();

    Integer getCode();
}

5,po中的配置

public class UserPO implements Serializable {
   ...
    @ColumnType(typeHandler = GenderEnumHandler.class)
    private GenderEnum gender;

6,mapper.xml中的配置

 <resultMap id="BaseResultMap" type="com.yiwise.core.dal.entity.UserPO">
       ...
        <result column="gender" jdbcType="INTEGER" property="gender"
                typeHandler="com.yiwise.core.model.enums.handler.GenderEnumHandler"/>
 </resultMap>
点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
11
获赞与收藏
107

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消