1、背景
使用Mybatis存储枚举类型,数据库中以int类型存储,需要进行类型转换(handler适配)
2、代码实现
枚举类定义:
public interface IEnum
{
int getValue();
void setValue(int value);
}
public enum EnumWhatIfChangeType implements IEnum
{
/**
* 不变
*/
UnChange(0),
/**
* 变化
*/
Changed(1);
private int value;
private EnumWhatIfChangeType(int value)
{
this.value = value;
}
@Override
public int getValue()
{
return this.value;
}
@Override
public void setValue(int value)
{
this.value = value;
}
}
Handler适配:
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
public class EnumValueTypeHandler extends BaseTypeHandler<IEnum>
{
private Class<IEnum> type;
/**
* 构造函数<br>
*/
public EnumValueTypeHandler(Class<IEnum> type)
{
this.type = type;
}
@Override
public IEnum getNullableResult(ResultSet rs, String columnName)
throws SQLException
{
int value = rs.getInt(columnName);
if (rs.wasNull())
{
return null;
}
else
{
return convertToEnum(value);
}
}
@Override
public IEnum getNullableResult(ResultSet rs, int columnIndex)
throws SQLException
{
int value = rs.getInt(columnIndex);
if (rs.wasNull())
{
return null;
}
else
{
return convertToEnum(value);
}
}
@Override
public IEnum getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException
{
// 数据库中存储int类型
int value = cs.getInt(columnIndex);
if (cs.wasNull())
{
return null;
}
else
{
return convertToEnum(value);
}
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, IEnum param,
JdbcType jdbcType) throws SQLException
{
ps.setInt(i, param.getValue());
}
private IEnum convertToEnum(int value)
{
IEnum[] iEnums = type.getEnumConstants();
for (IEnum iEnum : iEnums)
{
if (iEnum.getValue() == value)
{
return iEnum;
}
}
return null;
}
}
Mapper.xml中<resultMap中>添加转换:
<resultMap type="com.xxx.xxPM" id="xxPM">
<result property="changeType" column="CHANGETYPE" javaType="com.xxx.EnumChangeType" typeHandler="com.xxx.handler.EnumValueTypeHandler" />
</resultMap>
参考博客:
https://blog.csdn.net/jerome_s/article/details/53965293
扫描二维码关注公众号,回复:
4959273 查看本文章