MyBatis代码不加载枚举类型(版本:3.4.4)。
在MySQL数据库中,我有一个带有“cartype”字段的表,它是INT(11)类型。在Java中,我创建了一个用于处理汽车类型的枚举:
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>
最后,我的豆子看起来如下:
public class Car {
private Integer id;
private CarType carType;
}
bean也包含getters和setters。
当我尝试在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)
试试这个
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>
需要存储在数据库中的是枚举名,而不是id。
看看这里。默认的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"/>
枚举具有名为'hash value'的属性,该属性是枚举内的索引。
问题内容: 我试图确定如何访问JObject中的数据,但我终生无法确定如何使用它。 我可以将其打印到执行Console.WriteLine(Object)的控制台中,然后看到数据,它看起来像: 但是我不知道如何迭代/枚举它,任何人都有想法吗?我现在很茫然。 问题答案: 如果您查看相关文档,将会发现它实现了。因此,您可以使用以下命令简单地对其进行迭代:
本文向大家介绍Mybatis-Plus通用枚举的使用详解,包括了Mybatis-Plus通用枚举的使用详解的使用技巧和注意事项,需要的朋友参考一下 解决了繁琐的配置,让 mybatis 优雅的使用枚举属性! 修改表结构 定义枚举 配置 修改实体 测试 插入 SQL 查询 SQL 从测试可以看出,可以很方便的使用枚举了。 条件查询 SQL 到此这篇关于Mybatis-Plus通用枚举的使用详解的文章
我在我的项目中使用MyBatis和MySql。 我知道我可以修改所有mybatis模板,例如: 但我能用更方便的方式做到这一点吗?
问题内容: 我觉得这是一个简单的问题,但是我尝试过的所有事情都不适合我。我有一个枚举,我有字符串构造函数的原因是因为Java不允许枚举为数字..我在没有字符串构造函数的情况下直接尝试了AA,AB,2C,但这给出了错误。请注意,对于现有的枚举,我要添加C(“ 2C”)。 现在我有一个mybatis映射器,它会进行合并,这是现有的,并且映射器的参数之一是TestEnum。到目前为止,由于枚举值和字符串
问题内容: 我需要选择列的枚举值。通过搜索,我发现了两种方法: 和另一个: 尽管第一个查询将为我提供此信息: 第二个查询给了我相同的内容,并且还有其他列。我宁愿只获取那些没有“ enum()”和逗号的值,是否可能,还是我需要解析这些值?并不是仅检查是否有更简单的方法就很困难。 假设没有更简单的方法,那么上面两个查询中的哪个更适合使用?我注意到第二个查询在运行时没有显示查询时间,我几乎认为它根本不需