Mybatis enum按id选择

时间:2017-08-20 11:13:43

标签: java enums mybatis

我的MyBatis代码没有加载枚举类型(版本:3.4.4)。

在MySQL数据库中,我有一个表" cartype"字段是INT(11)类型。 在Java中,我创建了一个用于处理汽车类型的ENUM:

public enum CarType {
    SEDAN(1), LIMUSIN(2), WAGON(3);

    private int id;

    CarType(int id) {
        this.id = id;
    }

    public int getId() {
        return this.id;
    }
}

Car mapper xml看起来像这样(不包含所有数据):

<select id="selectCar" parameterType="Car" resultMap="carResultMap">
SELECT * FROM Cars WHERE car_name="#{carName}";
</select>

<resultMap id="carResultMap" type="Car">
    <id property="id" column="car_name"/>
    <result property="carType" column="cartype"/>
</resultMap>

最后我的bean看起来如下:

public class Car {
    private Integer id;
    private CarType carType;
}

bean也包含getter和setter。

当我尝试在java中获取Car时,会抛出以下异常:

Caused by: java.lang.IllegalArgumentException: No enum constant org.data.bean.CarType.1
    at java.lang.Enum.valueOf(Enum.java:238)
    at org.apache.ibatis.type.EnumTypeHandler.getNullableResult(EnumTypeHandler.java:49)
    at org.apache.ibatis.type.EnumTypeHandler.getNullableResult(EnumTypeHandler.java:26)
    at org.apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:66)

2 个答案:

答案 0 :(得分:2)

它是需要存储在数据库中的枚举名称,而不是id。

看看here。默认的EnumTypeHandler需要varchar:

  

VARCHAR任何字符串兼容类型,因为代码存储(而不是索引)。

如果您想要或必须存储ID,则需要自定义TypeHandler。像这样:

public class CarTypeTypeHandler implements TypeHandler<CarType> {

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

   @Override
   public CarType getResult(ResultSet rs, String param) throws SQLException {
      return CarType.get(rs.getInt(param));
   }

   @Override
   public CarType getResult(CallableStatement cs, int col) throws SQLException {
      return CarType.get(cs.getInt(col));
   }
}

在枚举中使用查找方法也很方便:

public static CarType get(int code) { 
   for(CarType s : values()) {
      if(s.id == code) return s;
   }
   return null;
}

您可能还需要在映射器中明确指出枚举类型。像这样添加一个javaType参数(我还包括一个样本类型处理程序定义):

<result property="carType" 
  column="cartype" javaType="path.to.package.CarType" 
  typeHandler="path.to.package.CarTypeTypeHandler"/>

答案 1 :(得分:0)

尝试一下

http://www.mybatis.org/mybatis-3/configuration.html#Handling_Enums

<!-- mybatis-config.xml -->
<typeHandlers>
  <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler"
    javaType="java.math.RoundingMode"/>
</typeHandlers>

根据您的情况

<!-- mybatis-config.xml -->
<typeHandlers>
  <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler"
    javaType="org.data.bean.CarType"/>
</typeHandlers>