Mybatis 枚举 select by id
Mybatis enum select by id
我的 MyBatis 代码没有加载枚举类型(版本:3.4.4)。
在 MySQL 数据库中,我有一个 table 和 "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 中获取汽车时,它抛出以下异常:
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)
需要存入数据库的是枚举名称,不是id。
看看here。默认的 EnumTypeHandler 需要一个 varchar:
VARCHAR any string compatible type, as the code is stored (not index).
如果您想要或必须存储 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"/>
试试这个
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>
我的 MyBatis 代码没有加载枚举类型(版本:3.4.4)。
在 MySQL 数据库中,我有一个 table 和 "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 中获取汽车时,它抛出以下异常:
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)
需要存入数据库的是枚举名称,不是id。
看看here。默认的 EnumTypeHandler 需要一个 varchar:
VARCHAR any string compatible type, as the code is stored (not index).
如果您想要或必须存储 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"/>
试试这个
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>