在 MyBatis(Java) 中处理枚举(enum)有多种方式,取决于你使用的 MyBatis 版本、是否使用 MyBatis-Plus、以及枚举在数据库中的存储形式(存 code / 存 name / 存序号)。
下面从 原生 MyBatis 和 MyBatis-Plus 两个角度系统说明。
| 存储方式 | 说明 | 示例 |
|---|---|---|
| 存 name | 存枚举名 | MONDAY |
| 存 code | 存自定义值(推荐) | 1, 2 |
| 存 ordinal | 存枚举序号(不推荐) | 0, 1 |
默认行为:存枚举的 name
public enum Status {
ENABLE, DISABLE
}
private Status status;
status = #{status}
✅ 数据库存:ENABLE / DISABLE
❌ 不能自定义 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("未知状态");
}
}
@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));
}
}
方式 A:XML 中指定
<result column="status" property="status"
typeHandler="com.xxx.StatusTypeHandler"/>
方式 B:全局配置
mybatis:
type-handlers-package: com.xxx.handler
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;
}
mybatis-plus:
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
✅ 数据库直接存 0 / 1
public enum Status {
ENABLE(1, "启用"),
DISABLE(0, "禁用");
@EnumValue
private final int code;
@JsonValue
private final String desc;
}
@EnumValueordinalcode| 场景 | 推荐方式 |
|---|---|
| 原生 MyBatis | 自定义 TypeHandler |
| MyBatis-Plus | @EnumValue |
| 前后端交互 | @JsonValue |
| 数据库存值 | 自定义 code(不要用 name / ordinal) |
如果你愿意,可以告诉我:
我可以直接给你一套 可复制的完整代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。