温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java mybatis怎么处理枚举

发布时间:2026-09-23 05:13:31 来源:亿速云 阅读:95 作者:小樊 栏目:编程语言

MyBatis(Java) 中处理枚举(enum)有多种方式,取决于你使用的 MyBatis 版本、是否使用 MyBatis-Plus、以及枚举在数据库中的存储形式(存 code / 存 name / 存序号)。

下面从 原生 MyBatisMyBatis-Plus 两个角度系统说明。


一、数据库中枚举的常见存储方式

存储方式 说明 示例
存 name 存枚举名 MONDAY
存 code 存自定义值(推荐) 1, 2
存 ordinal 存枚举序号(不推荐) 0, 1

二、原生 MyBatis 处理枚举

方式 1:使用 MyBatis 自带 EnumTypeHandler(默认)

默认行为:存枚举的 name

public enum Status {
    ENABLE, DISABLE
}
private Status status;
status = #{status}

✅ 数据库存:ENABLE / DISABLE
❌ 不能自定义 code


方式 2:实现 TypeHandler(推荐)

1️⃣ 定义枚举(带 code)

public enum Status {
    ENABLE(1),
    DISABLE(0);

    private final int code;

    Status(int code) {
        this.code = code;
    }

    public int getCode() {
        return code;
    }

    public static Status of(int code) {
        for (Status s : values()) {
            if (s.code == code) return s;
        }
        throw new IllegalArgumentException("未知状态");
    }
}

2️⃣ 自定义 TypeHandler

@MappedTypes(Status.class)
@MappedJdbcTypes(JdbcType.INTEGER)
public class StatusTypeHandler extends BaseTypeHandler<Status> {

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

    @Override
    public Status getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return Status.of(rs.getInt(columnName));
    }

    @Override
    public Status getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return Status.of(rs.getInt(columnIndex));
    }

    @Override
    public Status getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return Status.of(cs.getInt(columnIndex));
    }
}

3️⃣ 注册 TypeHandler

方式 A:XML 中指定

<result column="status" property="status"
        typeHandler="com.xxx.StatusTypeHandler"/>

方式 B:全局配置

mybatis:
  type-handlers-package: com.xxx.handler

三、MyBatis-Plus 处理枚举(强烈推荐)

方式 1:@EnumValue(最常用)

枚举定义

public enum Status {
    ENABLE(1, "启用"),
    DISABLE(0, "禁用");

    @EnumValue
    private final int code;

    private final String desc;

    Status(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}

实体类

@Data
public class User {
    private Long id;
    private Status status;
}

配置(Spring Boot)

mybatis-plus:
  configuration:
    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

✅ 数据库直接存 0 / 1


方式 2:@JsonValue(返回前端)

public enum Status {
    ENABLE(1, "启用"),
    DISABLE(0, "禁用");

    @EnumValue
    private final int code;

    @JsonValue
    private final String desc;
}

四、常见问题

❓ 数据库存 0/1,但查出来是 null?

  • 没加 @EnumValue
  • TypeHandler 没注册
  • 字段类型不匹配(INT vs VARCHAR)

❓ 枚举顺序变了导致数据错乱?

  • ❌ 不要用 ordinal
  • ✅ 用 code

五、推荐方案总结

场景 推荐方式
原生 MyBatis 自定义 TypeHandler
MyBatis-Plus @EnumValue
前后端交互 @JsonValue
数据库存值 自定义 code(不要用 name / ordinal)

如果你愿意,可以告诉我:

  • ✅ 是否使用 MyBatis-Plus
  • ✅ 数据库字段类型(INT / VARCHAR)
  • ✅ Spring Boot 还是纯 MyBatis

我可以直接给你一套 可复制的完整代码

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI