6

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

[速度.java]

public class SpeedEntry implements Serializable {

    [...]

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

    [...]

[速度状态.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非常直接地访问其内部 value 属性:

#{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>

所以......有可能实现我正在寻找的东西吗? 那里有任何简单的澄清例子吗?

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

提前致谢。

4

2 回答 2

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;
    }

}

于 2013-08-12T12:48:13.780 回答
4

如果要将 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,只要它在你的 Pojo 中遇到 SpeedStatus 枚举,mybatis 就会处理它。

于 2013-09-12T07:35:59.667 回答