文章结尾有代码下载地址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