MyBatisのマッピングプロパティは、挿入と更新の際にデータベース列にマッピングします(注釈を使用)

StackOverflow https://stackoverflow.com/questions/5369884

  •  27-10-2019
  •  | 
  •  

質問

私はMyBatisを学び始めたばかりで、挿入または更新クエリを作成しているとき、私は不動産名をリファクショナルにもう少し友好的にする方法がありますか?詳細に説明します。

プロパティ名を参照するために使用できるドメインクラスのすべてに定数があります。私の意見では、それはタイプミスを削減し、リファクタリングを少し簡単にします。

public static final String FIRST_NAME = "firstName";
private String firstName = "";

注釈を使用してMyBatis Selectステートメントを作成すると、次のようなことができます。

@Select("SELECT ID, FIRST_NAME, LAST_NAME FROM CUSTOMERS WHERE ID = #{id}")
@Results({
    @Result(property = CustomerDetail.ID, column = "ID"),
    @Result(property = CustomerDetail.FIRST_NAME, column = "FIRST_NAME"),
    @Result(property = CustomerDetail.LAST_NAME, column = "LAST_NAME")
})
CustomerDetail selectById(final int id);

ドメインオブジェクト(CustomerDetail)をリファクタリングしてプロパティ名を変更すると、かなり簡単になります。

ただし、注釈を使用してMyBatis INSERTステートメントを作成するとき、次のようなことをしなければなりません。

@Insert("INSERT INTO CUSTOMERS (ID, FIRST_NAME, LAST_NAME) VALUES (#{id}, #{firstName}, #{lastName})")
void insertCustomerDetail(final CustomerDetail customerDetail);

この場合、ドメインオブジェクト(CustomerDetail)をリファクタリングしてプロパティ名を変更すると、エラーが発生しやすくなります。文字列の連結の束に頼らずに定数を使用する方法はありますか?それは私が自分自身に関心を持つべきものですか?

完全な初心者として、私は@Selectアノテーションの構造を模倣するために@Insertと@Updateアノテーションを期待していました。たとえば(注意してください、以下は有効なmybatisアノテーションではありません):

@Insert("INSERT INTO CUSTOMERS (ID, FIRST_NAME, LAST_NAME)")
@Params({
    @Param(property = CustomerDetail.ID, column = "ID"),
    @Param(property = CustomerDetail.FIRST_NAME, column = "FIRST_NAME"),
    @Param(property = CustomerDetail.LAST_NAME, column = "LAST_NAME")
})
void insertCustomerDetail(final CustomerDetail customerDetail);

上記のサンプルと同じ効果を持つオプションを見逃しましたか?あるいは、MyBatisマッピングをユニットテストして、ドメインオブジェクトに存在しないプロパティ名を誰も使用していないことを確認することは可能ですか? XMLベースのマッピングにも適用されるため、テストはより良いソリューションになる可能性があります。考え?

役に立ちましたか?

解決

それは私が自分自身に関心を持つべきものですか?

私はそうは思わない。私はあなたの懸念を理解しています、そして、私はそのような機能があなたにとってどのように有益であるか、特にPojoが頻繁に変化する傾向がある開発の早い段階でどのように有益であるかを見ています。

この機能を提供するために必要な投資を正当化するために、あなたのオブジェクトフィールドが十分にリファクタリングされるとは思いません。

で@paramタグについて読むことをお勧めします MyBatisユーザーガイド. 。ここで探しているものではありませんが、オブジェクトのフィールド名をMyBatis SQLマップ変数に切り離す方法です。私の考えでは、私はあなたのアプローチを@paramで個々のフェイルドを通過することであなたのアプローチを取りました。

SQLマップの単体テストに関しては、オブジェクトに対応するGETメソッドを持たないOGNL式を使用すると、例外を取得することはかなり確信しています。 IE#{somefield}を使用し、渡されたオブジェクトがgetSomefield()メソッドを持っていない場合、例外を取得します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top