mybatis 中使用枚举
mybatis 中使用枚举
mybatis 中使用枚举
1. 内置枚举转换器
1.1 内置枚举转换器介绍
1.1.1 EnumTypeHandler
- 默认的枚举转换器,该转换器将枚举实例转换为实例名称的字符串,即将
SexEnum.MAN
转换MAN
1.1.2 EnumOrdinalTypeHandler
- 将枚举实例的
ordinal
属性作为取值,即SexEnum.MAN
转换为0
,SexEnum.WOMAN
转换为1
MyBatis内置枚举转换器
- org.apache.ibatis.type.EnumTypeHandler
- org.apache.ibatis.type.EnumOrdinalTypeHandler
1.2 内置枚举转换器使用
mybatis-config.xml
<typeHandlers>
<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="com.answer.aal.entity.StatusEnum" />
<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="com.answer.aal.entity.SexEnum" />
</typeHandlers>
- 1
- 2
- 3
- 4
2. 自定义类型转换器
2.1 BaseTypeHandler 抽象类
public abstract class BaseTypeHandler<T> extends TypeReference<T> implements TypeHandler<T> {
// ...
/**
* 用于定义设置参数时,该如何把Java类型的参数转换为对应的数据库类型
* */
public abstract void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType)
throws SQLException;
/**
* 用于定义通过字段名称获取字段数据时,如何把数据库类型转换为对应的Java类型
* */
public abstract T getNullableResult(ResultSet rs, String columnName) throws SQLException;
/**
* 用于定义通过字段索引获取字段数据时,如何把数据库类型转换为对应的Java类型
* */
public abstract T getNullableResult(ResultSet rs, int columnIndex) throws SQLException;
/**
* 用定义调用存储过程后,如何把数据库类型转换为对应的Java类型
* */
public abstract T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException;
}
2.2 自定义枚举转换器实现
2.2.1 枚举接口
枚举通用行为接口: IEnum
public interface IEnum<E extends Enum<?>, T> {
T getValue();
}
性别枚举: SexEnum
public enum SexEnum implements IEnum<EducationEnum, Integer> {
/** 男 */
MAN(0),
/** 女 */
WOMAN(1);
private int value;
SexEnum(int value) {
this.value = value;
}
@Override
public Integer getValue() {
return value;
}
}
学历枚举: EducationEnum
public enum EducationEnum implements IEnum<EducationEnum, String> {
/** 小学 */
PRIMARY_SCHOOL("PRIMARY"),
/**
* 初中
* */
JUNIOR_SCHOOL("JUNIOR"),
/**
* 高中
* */
HIGH_SCHOOL("HIGH"),
/**
* 大学
* */
UNIVERSITY_SCHOOL("UNIVERSITY")
;
private String value;
EducationEnum(String value) {
this.value = value;
}
@Override
public String getValue() {
return value;
}
}
2.2.2 自定义类型转换器
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Objects;
@MappedTypes(value = {SexEnum.class, EducationEnum.class})
public class BaseEnumTypeHandler<E extends Enum<E> & IEnum> extends BaseTypeHandler<E> {
/**
* 枚举的class
*/
private Class<E> type;
/**
* 枚举的每个子类枚
*/
private E[] enums;
/**
* 一定要有默认的构造函数, 不然抛出 not found method 异常
*/
public BaseEnumTypeHandler() {
}
/**
* 设置配置文件设置的转换类以及枚举类内容, 供其他方法更便捷高效的实现
*
* @param type 配置文件中设置的转换类
*/
public BaseEnumTypeHandler(Class<E> type) {
if (type == null) {
throw new IllegalArgumentException("Type argument cannot be null");
}
this.type = type;
this.enums = type.getEnumConstants();
if (this.enums == null) {
throw new IllegalArgumentException(type.getSimpleName()
+ " does not represent an enum type.");
}
}
/**
* 用于定义设置参数时,该如何把Java类型的参数转换为对应的数据库类型
* */
@Override
public void setNonNullParameter(PreparedStatement ps, int i, E parameter,
JdbcType jdbcType) throws SQLException {
/*
* BaseTypeHandler已经帮我们做了parameter的null判断
* 数据库存储的是枚举的值, 所以我们这里使用 value , 如果需要存储 name, 可以自定义修改
*/
if (jdbcType == null) {
ps.setString(i, Objects.toString(parameter.getValue()));
} else {
ps.setObject(i, parameter.getValue(), jdbcType.TYPE_CODE);
}
}
/**
* 用于定义通过字段名称获取字段数据时,如何把数据库类型转换为对应的Java类型
* */
@Override
public E getNullableResult(ResultSet rs, String columnName)
throws SQLException {
String i = rs.getString(columnName);
if (rs.wasNull()) {
return null;
} else {
return locateEnumStatus(i);
}
}
/**
* 用于定义通过字段索引获取字段数据时,如何把数据库类型转换为对应的Java类型
* */
@Override
public E getNullableResult(ResultSet rs, int columnIndex)
throws SQLException {
String i = rs.getString(columnIndex);
if (rs