package com.sinata.common.enums.handler;
|
|
import com.sinata.common.enums.*;
|
import com.sinata.common.enums.base.enums.BaseEnum;
|
import com.sinata.common.enums.mall.EnumMallOrderState;
|
import lombok.extern.slf4j.Slf4j;
|
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;
|
|
/**
|
* <p>
|
* 自动处理枚举类型
|
* </p>
|
*
|
* @ClassName com.sinata.data.common.handler.AutoEnumTypeHandler
|
* @Description 自动处理枚举类型
|
* @Author BaiHua
|
* @Date 2019/10/18 11:31
|
*/
|
@Slf4j
|
@MappedTypes({
|
EnumUserBankDetailDoneType.class, EnumUserBankDetailType.class, EnumIsObj.class, EnumNoticeMessageType.class,
|
EnumUrlJumpType.class, EnumVerifyState.class, EnumIsDelete.class, EnumPayType.class,
|
EnumMallOrderState.class
|
|
})
|
public class AutoEnumTypeHandler<E extends BaseEnum> extends BaseTypeHandler<E> {
|
private Class<E> type;
|
|
private E[] enums;
|
|
/**
|
* 设置配置文件设置的转换类以及枚举类内容,供其他方法更便捷高效的实现
|
*
|
* @param type 配置文件中设置的转换类
|
*/
|
public AutoEnumTypeHandler(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.");
|
}
|
|
@Override
|
public void setNonNullParameter(PreparedStatement ps, int i, E parameter,
|
JdbcType jdbcType) throws SQLException {
|
//BaseTypeHandler已经帮我们做了parameter的null判断(知道类型,直接转换)
|
log.debug("设置枚举值{}", parameter.getMark());
|
ps.setInt(i, parameter.getIndex());
|
|
}
|
|
@Override
|
public E getNullableResult(ResultSet rs, String columnName)
|
throws SQLException {
|
// 根据数据库存储类型决定获取类型,本例子中数据库中存放String类型
|
int i = rs.getInt(columnName);
|
if (rs.wasNull()) {
|
return null;
|
} else {
|
// 根据数据库中的value值,定位PersonType子类
|
return locateEnumStatus(i);
|
}
|
}
|
|
@Override
|
public E getNullableResult(ResultSet rs, int columnIndex)
|
throws SQLException {
|
// 根据数据库存储类型决定获取类型,本例子中数据库中存放String类型
|
int i = rs.getInt(columnIndex);
|
if (rs.wasNull()) {
|
return null;
|
} else {
|
// 根据数据库中的value值
|
return locateEnumStatus(i);
|
}
|
}
|
|
@Override
|
public E getNullableResult(CallableStatement cs, int columnIndex)
|
throws SQLException {
|
// 根据数据库存储类型决定获取类型,本例子中数据库中存放String类型
|
int i = cs.getInt(columnIndex);
|
if (cs.wasNull()) {
|
return null;
|
} else {
|
// 根据数据库中的value值
|
return locateEnumStatus(i);
|
}
|
}
|
|
/**
|
* 枚举类型转换,由于构造函数获取了枚举的子类enums,让遍历更加高效快捷
|
*
|
* @param value 数据库中存储的自定义value属性
|
* @return value对应的枚举类
|
*/
|
private E locateEnumStatus(int value) {
|
for (E e : enums) {
|
if (e.getIndex() == value) {
|
log.debug("{}转换枚举值{}", value, e.getMark());
|
return e;
|
}
|
}
|
return null;
|
}
|
|
}
|