2

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 INTO CUSTOMERS (ID, FIRST_NAME, LAST_NAME) VALUES (#{id}, #{firstName}, #{lastName})")
void insertCustomerDetail(final CustomerDetail customerDetail);

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

まったくの初心者として、@Insert および @Update アノテーションが @Select アノテーションの構造を模倣することを期待していました。例 (以下は有効な 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 ベースのマッピングにも適用されるため、より良い解決策になる可能性があります。考え?

4

1 に答える 1

1

それは私自身も気にする必要がありますか?

私はそうは思わない。私はあなたの懸念を理解しており、特に POJO が頻繁に変更される傾向がある開発の初期段階で、そのような機能がどのように有益であるかを理解しています。

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

mybatis ユーザーガイドの @Param タグについて読むことをお勧めします。ここで探しているものとはまったく異なりますが、オブジェクト フィールド名を mybatis sql マップ変数に分離する方法です。私の考えでは、@Param を使用して個々のフィールドを渡すよりも、あなたのアプローチを取ると思います。

SQL マップの単体テストに関しては、オブジェクトに対応する get メソッドを持たない ognl 式を使用すると、例外が発生することは確かです。つまり、#{someField} を使用し、渡したオブジェクトに getSomeField() メソッドがない場合、例外が発生します。

于 2011-03-23T06:32:11.160 に答える