qinfengge

qinfengge

醉后不知天在水,满船清梦压星河
github

mybatis-plusのカスタムデータ型の設定

仕事中に学ぶことは速いですが、さまざまな奇妙な要求が私に振りかかってきます。余計なことは言わずに、直接始めましょう。

既知の要求は、アンケートフォームを設計することで、現時点ではアンケートの質問タイプは単一選択肢のみです。どのようにテーブルとデータベースを設計するか。

問題テーブルは以下のようになります。

疼痛分類説明スコア
0無痛0
1微痛2
2激痛4

1 つの問題には複数の選択肢があり、各選択肢には異なるスコアがあり、最終的なアンケートのスコアを計算するために使用されます。

単一のテーブルを作成すると非常に複雑で論理的にも明確ではないため、問題を分離することができます。

オプションテーブル

/**
     * オプションの説明
     */
    private String description;
    /**
     * オプションのスコア
     */
    private Integer score;

そして、データベースに直接 JSON を保存します。将来の拡張も簡単になります。

では、どのようにして JSON をデータベースに保存するのでしょうか?

アンケートテーブル

	//アンケートID
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    //問題名
    private String name;

    private Integer typeId;
    //オプション1、オプションテーブルに対応
    private OptionDto op1;

非常に簡単です。直接 fast json を使用し、アンケートテーブルの特定のフィールドの set メソッドをオーバーライドします。

 public void setOp1(OptionDto dto) {
     //OptionDtoオブジェクトをJSON文字列に変換する
        this.op1 = JSON.toJSONString(dto);
    }

これにより、OptionDto を JSON に変換してデータベースに保存することができます。

しかし、データベースからデータを取得すると、OptionDto のデータが null になっていることに気付くでしょう。クエリは問題ないはずですし、SQL も取得できますが、値を割り当てることができません。

これは、mybatis-plus がカスタムデータ型を処理できないためです。データベースは VARCHAR ですが、コードでは String ではないため、値を割り当てることができません。

Type Handle#

良いニュースは、mybatis-plus がコードとデータベース間のデータフローを処理するためのカスタムタイプハンドラを提供していることです。

typeHandle を使用するには、設定ファイルで次のように設定する必要があります。

# カスタムタイプハンドラのパッケージパスを設定します
mybatis-plus.type-handlers-package=xyz.qinfengge.handel

次に、ハンドラクラスを設定します。

@MappedTypes({OptionDto.class})
@MappedJdbcTypes({JdbcType.VARCHAR})
public class OptionsTypeHandel extends BaseTypeHandler<OptionDto> {
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, OptionDto optionDto, JdbcType jdbcType) throws SQLException {
        preparedStatement.setString(i, optionDto.toString());
    }

    @Override
    public OptionDto getNullableResult(ResultSet resultSet, String s) throws SQLException {
        return resultSet.getString(s) == null ? null : str2Dto(resultSet.getString(s));
    }

    @Override
    public OptionDto getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return resultSet.getString(i) == null ? null : str2Dto(resultSet.getString(i));
    }

    @Override
    public OptionDto getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return callableStatement.getString(i) == null ? null : str2Dto(callableStatement.getString(i));
    }

    //StringをOptionDtoに変換する
    public static OptionDto str2Dto(String string) {
        //JSON文字列をOptionDtoオブジェクトに変換する
        return JSON.parseObject(string, OptionDto.class);
    }
}
  • @MappedTypesには、コード中のデータ型を記述します
  • @MappedJdbcTypesには、データベース中のデータ型を記述します

4 つのメソッドをオーバーライドします。最初のメソッドはデータを保存するため、直接 optionDto.toString () をデータベースに保存します。次の 3 つのメソッドはクエリ文で、JSON をオブジェクトに変換する必要があります。書かない場合は null になります。

最後に、エンティティクラスで使用するカスタムデータ型のタイプハンドラを指定します。

	//アンケートID
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    //問題名
    private String name;

    private Integer typeId;
    //オプション1、オプションテーブルに対応
    //タイプハンドラを指定
    @TableField(typeHandler = OptionsTypeHandel.class)
    private OptionDto op1;

これで OK です。

  1. mybatis-plus のカスタムデータ型 TypeHandle の設定方法
  2. MyBatis TypeHandler の学習と実践
  3. Mybatis で JSON フィールドをエレガントに保存および取得するための解決策 - TypeHandler (1)
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。