MyBatis从MySql DB中检索整数为Enum

时间:2013-08-12 08:33:54

标签: mysql enums mybatis pojo

我有一个包含枚举属性的POJO。

[Speed.java]

public class SpeedEntry implements Serializable {

    [...]

    private int idSpeed;
    private SpeedStatus status; // enum Property

    [...]

[SpeedStatus.java]

public enum SpeedStatus {

[...]

VALID(1), INVALID(2), UNKNOWN(0);   // Possible values.

private int value;

// Default constructor
private SpeedStatus(final int pValue) {
    this.value = pValue;
}
[...]

我希望存储和检索Speed对象,并像往常一样使用MyBatis填充其属性。 分配给SpeedStatus的列创建为 INT(11)

在这种情况下,执行 INSERT 非常直接访问其内部值属性:

#{status.value}

但是,检索对象并从存储在数据库中的整数中获取其枚举值并不像插入它那么容易。没有运气,我尝试使用 resultMap

[speedMapper.xml]

<resultMap id="speedMap" type="Speed">
        <result property="idSpeed" column="idSpeed" />
        <result column="status" property="status.value" 
            typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
</resultMap>

所以...... 有可能实现我想要的目标吗? 那边有简单的澄清例子吗?

最佳选择是什么?我应该将存储在数据库中的类型更改为“枚举”吗?

提前致谢。

2 个答案:

答案 0 :(得分:4)

在插入语句中,您可以通过

直接访问其内部值
#{status.value}

通过这种方式,您可以按值1插入VALID,按值2插入INVALID,按值0插入NUKNOWN。 但是在您的回溯语句中,您使用了

定义的resultMap
typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"

这意味着您使用

将表 int(11)字段映射到Enum POJO属性
SpeedStatus.ordinal()

枚举值将按SpeedStatus中定义的顺序进行映射。所以在select语句中,表字段值0映射到VALID,1映射到INVALID,2映射到UNKNOWN。

如果您仍想使用EnumOrdinalTypeHandler,则应将Enum值定义为等于ordinal()值。

public enum SpeedStatus {

    UNKNOWN(0), VALID(1), INVALID(2); 

    private int value;

    private SpeedStatus(final int pValue) {
        this.value = pValue;
    }

}

答案 1 :(得分:3)

如果要将int转换为Enum,可以定义自己的EnumHandler。

public class SpeedStatusTypeHandler implements TypeHandler<SpeedStatus> {

public SpeedStatus getResult(ResultSet rs, String param) throws SQLException {
return SpeedStatus.getEnum(rs.getInt(param));
}

public SpeedStatus getResult(CallableStatement cs, int col) throws SQLException {
return SpeedStatus.getEnum(cs.getInt(col));
}

public void setParameter(PreparedStatement ps, int paramInt, SpeedStatus paramType, JdbcType jdbctype)
    throws SQLException {
ps.setInt(paramInt, paramType.getId());
}
}

现在只需将此typeHandler添加到我的batis配置文件

即可
 <typeHandlers> 
        <typeHandler javaType='SpeedStatus' handler='SpeedStatusTypeHandler' /> 
</typeHandlers>

你甚至不必在你的resultMap中提到你的typeHandler,mybatis会在你的Pojo中遇到SpeedStatus Enum时处理它。