MyBatis从MySql数据库中检索整数作为枚举

MyBatis从MySql数据库中检索整数作为枚举,mysql,enums,mybatis,pojo,Mysql,Enums,Mybatis,Pojo,我有一个包含枚举属性的POJO [Speed.java] public class SpeedEntry implements Serializable { [...] private int idSpeed; private SpeedStatus status; // enum Property [...] public enum SpeedStatus { [...] VALID(1), INVALID(2), UNKNOWN(0); //

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

[Speed.java]

public class SpeedEntry implements Serializable {

    [...]

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

    [...]
public enum SpeedStatus {

[...]

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

private int value;

// Default constructor
private SpeedStatus(final int pValue) {
    this.value = pValue;
}
[...]
<resultMap id="speedMap" type="Speed">
        <result property="idSpeed" column="idSpeed" />
        <result column="status" property="status.value" 
            typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
</resultMap>
[SpeedStatus.java]

public class SpeedEntry implements Serializable {

    [...]

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

    [...]
public enum SpeedStatus {

[...]

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

private int value;

// Default constructor
private SpeedStatus(final int pValue) {
    this.value = pValue;
}
[...]
<resultMap id="speedMap" type="Speed">
        <result property="idSpeed" column="idSpeed" />
        <result column="status" property="status.value" 
            typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
</resultMap>
我想存储和检索Speed对象,并像往常一样用MyBatis填充它的属性。 分配给SpeedStatus的列被创建为INT(11)

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

#{status.value}
但是,检索对象并从存储在数据库中的整数中获取其枚举值并不像插入它那样容易。我尝试使用结果图,但运气不佳:

[speedMapper.xml]

public class SpeedEntry implements Serializable {

    [...]

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

    [...]
public enum SpeedStatus {

[...]

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

private int value;

// Default constructor
private SpeedStatus(final int pValue) {
    this.value = pValue;
}
[...]
<resultMap id="speedMap" type="Speed">
        <result property="idSpeed" column="idSpeed" />
        <result column="status" property="status.value" 
            typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
</resultMap>

所以…有可能实现我想要的吗? 有什么简单的例子可以说明问题吗

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


提前感谢。

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

#{status.value}
通过这种方式,可以插入VALID By值1、INVALID By值2、NUKNOWN By值0。 但是在检索语句中,您使用

typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"
这意味着您可以使用

SpeedStatus.ordinal()
枚举值将按照
SpeedStatus
中定义的顺序进行映射。因此,在select语句表中,字段值0映射为有效,1映射为无效,2映射为未知

如果仍要使用
EnumOrdinalTypeHandler
,则应将枚举值定义为其
ordinal()

public enum SpeedStatus {

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

    private int value;

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

}

如果要将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());
}
}
公共类SpeedStatusTypeHandler实现TypeHandler{
public SpeedStatus getResult(结果集rs,字符串参数)引发SQLException{
返回SpeedStatus.getEnum(rs.getInt(param));
}
public SpeedStatus getResult(CallableStatement cs,int col)抛出SQLException{
返回SpeedStatus.getEnum(cs.getInt(col));
}
公共void setParameter(PreparedStatement ps、int-paramInt、SpeedStatus-paramType、JdbcType-JdbcType)
抛出SQLException{
ps.setInt(paramInt,paramType.getId());
}
}
现在只需将这个typeHandler添加到my batis配置文件中

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


您甚至不必在resultMap中提到您的typeHandler,mybatis将在您的Pojo中遇到SpeedStatus枚举时处理它。

对不起,我忘了提到选项typeHandler=“org.apache.ibatis.type.EnumOrdinalTypeHandler”加载JAR-->java.lang.RuntimeException时出错:调用处理程序类org.apache.ibatis.type.EnumOrdinalTypeHandler的构造函数失败。我目前正在使用MyBatis Spring,没有加载任何MyBatis-config.xml文件。我刚刚使用org.apache.ibatis.type.EnumOrdinalTypeHandler编写了一个单元测试。我已经得到了我想要的结果。我需要更多的信息来检查问题我有问题。property=“status”,而不是“status.value”。请再读一遍我的答案。检索映射需要更改SpeedStatus定义。似乎有一些名称不匹配…关键是在resultMap中为结果标签的列和属性属性指定不同的值:根据您的建议,它工作正常;)再次感谢。谢谢你节省了我的时间。