mybatis 自定義typeHandler

 

文章結尾有代碼下載地址java

1.抽象類git

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 Typesql

    相似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.泛型枚舉apache

 

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;
    }


}

 

自定義枚舉mybatis

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;
    }
}

示例:app

在mybatis-generator 對應位置增長如下配置生成 Model和 Mapper文件ide

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

代碼能夠在 https://gitee.com/luck/mybatis-generator-plugin 下載this

相關文章
相關標籤/搜索