当前位置: 首页 > 知识库问答 >
问题:

Mybatis枚举通过id选择

卫琛
2023-03-14

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)

共有2个答案

裴韬
2023-03-14

试试这个

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>
郑宇
2023-03-14

需要存储在数据库中的是枚举名,而不是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()”和逗号的值,是否可能,还是我需要解析这些值?并不是仅检查是否有更简单的方法就很困难。 假设没有更简单的方法,那么上面两个查询中的哪个更适合使用?我注意到第二个查询在运行时没有显示查询时间,我几乎认为它根本不需