文章結尾有代碼下載地址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