首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MyBatis从MySql DB检索Integer作为Enum

MyBatis从MySql DB检索Integer作为Enum
EN

Stack Overflow用户
提问于 2013-08-12 08:33:53
回答 2查看 12.8K关注 0票数 6

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

Speed.java

代码语言:javascript
复制
public class SpeedEntry implements Serializable {

    [...]

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

    [...]

SpeedStatus.java

代码语言:javascript
复制
public enum SpeedStatus {

[...]

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

private int value;

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

我想存储和检索速度对象,并像往常一样用MyBatis填充它的属性。分配给SpeedStatus的列是作为INT(11)创建的。

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

代码语言:javascript
复制
#{status.value}

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

speedMapper.xml

代码语言:javascript
复制
<resultMap id="speedMap" type="Speed">
        <result property="idSpeed" column="idSpeed" />
        <result column="status" property="status.value" 
            typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
</resultMap>

所以.有可能达到我想要的目的吗?有什么简单的澄清例子吗?

最好的选择是什么?是否应该将存储在数据库中的类型更改为"enum“?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-12 12:48:13

在insert语句中,可以通过以下方式直接访问其内部值

代码语言:javascript
复制
#{status.value}

通过这种方式,可以按值1插入有效,值2插入无效,值0插入NUKNOWN。但是在检索语句中,使用由

代码语言:javascript
复制
typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"

表示将表int(11)字段映射到Enum属性

代码语言:javascript
复制
SpeedStatus.ordinal()

Enum值将由SpeedStatus中定义的顺序映射。因此,在select语句表字段值中,0映射为有效,1映射为无效,2映射为未知。

如果您仍然想使用EnumOrdinalTypeHandler,您应该定义Enum值等于它的ordinal()值。

代码语言:javascript
复制
public enum SpeedStatus {

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

    private int value;

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

}

票数 4
EN

Stack Overflow用户

发布于 2013-09-12 07:35:59

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

代码语言:javascript
复制
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文件中,

代码语言:javascript
复制
 <typeHandlers> 
        <typeHandler javaType='SpeedStatus' handler='SpeedStatusTypeHandler' /> 
</typeHandlers>

您甚至不必在您的typeHandler中提到您的resultMap,每当在Pojo中遇到SpeedStatus Enum时,没药就会处理它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18182589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档