MyBatis 可以映射到枚举类吗?

是的,MyBatis 可以映射到 Java 的枚举类型。默认情况下,MyBatis 会使用枚举名称来进行映射。例如,给定以下枚举:

public enum UserStatus {
  ACTIVE,
  INACTIVE
}

你可以在 MyBatis 映射文件中这样使用:

<resultMap id="UserResultMap" type="com.example.User">
  <!-- 其他字段映射 -->
  <result property="status" column="status"/>
</resultMap>

在这个例子中,数据库表的 status 列应该包含 ACTIVEINACTIVE 之一的字符串值。

然而,如果你希望根据枚举的顺序值(ordinal)或者其他自定义的字段进行映射,你需要实现并注册一个 TypeHandler。

例如,如果你有一个 status 列,它的值为 0 或 1,表示 UserStatusACTIVEINACTIVE,你可以创建以下 TypeHandler:

public class UserStatusTypeHandler extends BaseTypeHandler<UserStatus> {

  @Override
  public void setNonNullParameter(PreparedStatement ps, int i, UserStatus parameter, JdbcType jdbcType) throws SQLException {
    ps.setInt(i, parameter.ordinal());
  }

  @Override
  public UserStatus getNullableResult(ResultSet rs, String columnName) throws SQLException {
    int status = rs.getInt(columnName);
    return UserStatus.values()[status];
  }

  // 其他方法...
}

然后在 MyBatis 配置文件中注册这个 TypeHandler:

<typeHandlers>
  <typeHandler handler="com.example.UserStatusTypeHandler" javaType="com.example.UserStatus"/>
</typeHandlers>

现在,MyBatis 会使用 UserStatusTypeHandler 来处理 UserStatus 枚举类型。

发表评论

后才能评论