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