我有一个包含枚举属性的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;
}
[...]我想存储和检索速度对象,并像往常一样用MyBatis填充它的属性。分配给SpeedStatus的列是作为INT(11)创建的。
在这种情况下,执行插入非常直接地访问其内部值属性:
#{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>所以.有可能达到我想要的目的吗?有什么简单的澄清例子吗?
最好的选择是什么?是否应该将存储在数据库中的类型更改为"enum“?
提前谢谢。
发布于 2013-08-12 12:48:13
在insert语句中,可以通过以下方式直接访问其内部值
#{status.value}通过这种方式,可以按值1插入有效,值2插入无效,值0插入NUKNOWN。但是在检索语句中,使用由
typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"表示将表int(11)字段映射到Enum属性
SpeedStatus.ordinal()Enum值将由SpeedStatus中定义的顺序映射。因此,在select语句表字段值中,0映射为有效,1映射为无效,2映射为未知。
如果您仍然想使用EnumOrdinalTypeHandler,您应该定义Enum值等于它的ordinal()值。
public enum SpeedStatus {
UNKNOWN(0), VALID(1), INVALID(2);
private int value;
private SpeedStatus(final int pValue) {
this.value = pValue;
}}
发布于 2013-09-12 07:35:59
如果要将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>您甚至不必在您的typeHandler中提到您的resultMap,每当在Pojo中遇到SpeedStatus Enum时,没药就会处理它。
https://stackoverflow.com/questions/18182589
复制相似问题