mybatis 自定义typeHandler

 

文章结尾有代码下载地址

1.抽象类


import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandlerRegistry;


import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public abstract class TransformTypeHandler<E> extends BaseTypeHandler<E> {

    protected Class<E> type;
    protected static TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry();


    private BaseTypeHandler originalTypeHandler;

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


    }

    /**
     * JAVA数据类型转JDBC数据类型
     *
     * @param parameter
     * @return
     */
    protected abstract Object toJdbcType(E parameter);

    /**
     * JDBC数据类型转JDBC数据类型
     *
     * @param parameter
     * @return
     */
    protected abstract E toJavaType(Object parameter);

    /**
     * 返回字段对应的JdbcType
     *
     * @return
     */
    protected abstract JdbcType jdbcType();

    protected BaseTypeHandler getOriginalTypeHandler() {
        if (originalTypeHandler == null) {
            JdbcType jdbcType = jdbcType();
            if (jdbcType != null) {
                originalTypeHandler = (BaseTypeHandler) typeHandlerRegistry.getTypeHandler(jdbcType);
            }


        }
        return originalTypeHandler;
    }


    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {


        getOriginalTypeHandler().setNonNullParameter(ps, i, toJdbcType(parameter), jdbcType);

    }

    @Override
    public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
        Object object = getOriginalTypeHandler().getNullableResult(rs, columnName);
        return toJavaType(object);
    }

    @Override
    public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        Object object = getOriginalTypeHandler().getNullableResult(rs, columnIndex);
        return toJavaType(object);
    }

    @Override
    public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {

        Object object = getOriginalTypeHandler().getNullableResult(cs, columnIndex);

        return toJavaType(object);

    }


}

2. yes_no Type

    类似Hibernate里的@Type("yes_no")


import org.apache.ibatis.type.JdbcType;
import java.util.Objects;


public class YesNoTypeHandler extends TransformTypeHandler<Boolean> {

    private static final String YES = "yes";
    private static final String NO = "no";

    public YesNoTypeHandler(Class<Boolean> type) {
        super(type);
    }

    @Override
    protected Object toJdbcType(Boolean parameter) {
        return Boolean.TRUE.equals(parameter) ? YES : NO;
    }

    @Override
    protected Boolean toJavaType(Object parameter) {
        return YES.equalsIgnoreCase(Objects.toString(parameter));
    }

    @Override
    protected JdbcType jdbcType() {
        return JdbcType.VARCHAR;
    }
}

3.泛型枚举

 


import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandlerRegistry;

import java.lang.reflect.ParameterizedType;

import java.util.HashMap;
import java.util.Map;


public class GenericEnumTypeHandler<E extends Enum<E> & GenericEnumTypeHandler.GenericEnum> extends TransformTypeHandler<E> {
    /**
     * 枚举类型接口
     * @param <E>
     */
    interface GenericEnum<E> {
        /**
         *  对应数据表数据类型
         * @return
         */
        JdbcType jdbcType();

        /**
         * 存在数据库里的最终数据
         * @return
         */
        E value();
    }


    private final Map<Object, E> enums = new HashMap<Object, E>();
    private static TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry();


    private BaseTypeHandler originalTypeHandler;

    public GenericEnumTypeHandler(Class<E> type) {
        super(type);


        E[] elements = type.getEnumConstants();
        if (elements == null) {
            throw new IllegalArgumentException(type.getSimpleName() + " does not represent an enum type.");
        }

        for (E element : elements) {
            enums.put(element.value(), element);
        }
    }

    @Override
    protected Object toJdbcType(E parameter) {
        return parameter.value();
    }

    @Override
    protected E toJavaType(Object parameter) {
        return enums.get(parameter);
    }

    @Override
    protected JdbcType jdbcType() {
        for (E columnType : enums.values()) {
            JdbcType jdbcType = columnType.jdbcType();
            return jdbcType;
        }

        return null;
    }

    protected BaseTypeHandler getOriginalTypeHandler() {
        if (originalTypeHandler == null) {


            JdbcType jdbcType = jdbcType();

            ParameterizedType parameterizedType = (ParameterizedType) type.getGenericSuperclass();
            Class<E> javaType = (Class) parameterizedType.getActualTypeArguments()[0];

            if (jdbcType != null && javaType != null) {
                originalTypeHandler = (BaseTypeHandler) typeHandlerRegistry.getTypeHandler(javaType, jdbcType);
            } else if (jdbcType != null) {
                originalTypeHandler = (BaseTypeHandler) typeHandlerRegistry.getTypeHandler(jdbcType);
            } else {
                originalTypeHandler = (BaseTypeHandler) typeHandlerRegistry.getTypeHandler(javaType);
            }


        }
        return originalTypeHandler;
    }


}

 

自定义枚举

import org.apache.ibatis.type.JdbcType;

public enum State implements  GenericEnumTypeHandler.GenericEnum<String> {


    NORMAL("normal"),UNAUDITED("unaudited"),TRASH("trash");
    String value;

     State(String value) {
        this.value = value;
    }

    @Override
    public JdbcType jdbcType() {
        return JdbcType.VARCHAR;
    }

    @Override
    public java.lang.String value() {
        return value;
    }
}

示例:

在mybatis-generator 对应位置增加以下配置生成 Model和 Mapper文件

<columnOverride column="state" typeHandler="com.xx.GenericEnumTypeHandler" javaType="com.xx.State"/>

代码可以在 https://gitee.com/luck/mybatis-generator-plugin 下载

转载于:https://my.oschina.net/u/560755/blog/3068542

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值