コンテンツにスキップ

列挙型の自動マッピング

MyBatis の EnumOrdinalTypeHandler(列挙定数の序数ベース)および EnumTypeHandler(列挙定数名ベース)に加えて、 より柔軟な列挙型ハンドラーである MybatisEnumTypeHandler(列挙定数プロパティベース)を提供しています。 列挙型を宣言するだけで、列挙型の自動マッピングを実現できます。 宣言されていない列挙型は、mybatisdefaultEnumTypeHandler のデフォルト値である EnumTypeHandler に基づいてマッピングされます。

public class User {
private String name; // 名前
private AgeEnum age; // 年齢
private GradeEnum grade; // 学年
}

列挙型の宣言

MybatisEnumTypeHandler(列挙定数プロパティベース)を使用してマッピングする列挙型を宣言します。

方法 1: アノテーションによるマーキング

列挙型のプロパティに @EnumValue アノテーションを使用し、データベースに保存される実際の列挙値を指定します。列挙クラス内の任意のフィールド(序数やコードなど)をサポートします。

@Getter
@AllArgsConstructor
public enum GradeEnum {
PRIMARY(1, "小学"),
SECONDARY(2, "中学"),
HIGH(3, "高中");
@EnumValue // データベースに保存される値が code であることを示す
private final int code;
// その他のプロパティ...
}

方法 2: インターフェースの実装

IEnum インターフェースを実装し、getValue メソッドを実装して、データベースに保存される実際の列挙値を指定します。列挙クラス内の任意のフィールド(序数やコードなど)をサポートします。

@Getter
@AllArgsConstructor
public enum AgeEnum implements IEnum<Integer> {
ONE(1, "一岁"),
TWO(2, "二岁"),
THREE(3, "三岁");
private final int value;
private final String desc;
@Override
public Integer getValue() {
return this.value;
}
}

未宣言の列挙型

宣言されていない列挙型は、mybatisdefaultEnumTypeHandler のデフォルト値である EnumTypeHandler を使用してマッピングされます。 グローバル設定を変更することで変更できますが、上記の手順で宣言された列挙型には影響しません。

グローバルな defaultEnumTypeHandler の変更

YAML 設定ファイルで設定:

mybatis-plus:
configuration:
default-enum-type-handler: xx.xx.xx.MyEnumTypeHandler

または、カスタム設定クラスを使用:

@Configuration
public class MybatisPlusAutoConfiguration {
@Bean
public MybatisPlusPropertiesCustomizer mybatisPlusPropertiesCustomizer() {
return properties -> {
GlobalConfig globalConfig = properties.getGlobalConfig();
globalConfig.setBanner(false);
MybatisPlusProperties.CoreConfiguration configuration = new MybatisPlusProperties.CoreConfiguration();
configuration.setDefaultEnumTypeHandler(MyEnumTypeHandler.class);
properties.setConfiguration(configuration);
};
}
}

またはその他の方法

参考情報: 列挙値をフロントエンドの戻り値としてシリアライズする方法

Jackson

方法 1: toString メソッドのオーバーライド

Spring Boot
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return builder -> builder.featuresToEnable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
}
Jackson 単体使用
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true);

列挙型で toString メソッドをオーバーライドし、上記のいずれかの方法を選択します。

方法 2: アノテーションによる処理

public enum GradeEnum {
PRIMARY(1, "小学"),
SECONDORY(2, "中学"),
HIGH(3, "高中");
GradeEnum(int code, String descp) {
this.code = code;
this.descp = descp;
}
@EnumValue
@JsonValue // レスポンス JSON 値をマーク
private final int code;
}

Fastjson

方法 1: toString メソッドのオーバーライド

グローバルな処理方法
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(SerializerFeature.WriteEnumUsingToString);
ローカルな処理方法
@JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
private UserStatus status;

列挙型で toString メソッドをオーバーライドし、上記のいずれかの方法を選択します。

以上の手順により、MyBatis-Plus で列挙型プロパティをエレガントに使用し、列挙値をフロントエンドに必要な形式に簡単にシリアライズできるようになります。

Baomidou

© 2016-2025 Baomidou™. All Rights Reserved.

Power by Astro Starlight | Sponsored by JetBrains

渝ICP备2021000141号-1 | 渝公网安备50011302222097