インプリメンテーション・クラスからハンドラー・クラスを作成し、別個のファイルに配置する

アノテーション付きメソッドのインターフェース用にワークベンチが生成するインプリメンテーション・クラスに作成されるハンドラー・クラスは、個別にカスタマイズすることができます。

このタスクについて

例えば、アノテーション付きメソッドが照会に対して返す結果を、pureQuery が処理する方法をカスタマイズするとします。 独自の RowHandler クラスを最初から作成するのではなく、そのメソッドを宣言するインターフェース用にワークベンチが生成した、インプリメンテーション・クラスにすでに存在する RowHandler クラスを変更することができます。

インプリメンテーション・クラス内で直接ハンドラー・クラスを変更することは可能ですが、ハンドラー・クラス自体を編集した方が都合のよい場合もあります。

「インターフェース用のハンドラー・クラスの作成」ウィザードを使用すると、ワークベンチによりハンドラー・クラスが生成されたインプリメンテーション・クラスから、ハンドラー・クラスを分離することができます。 ワークベンチはそれらのハンドラー・クラスを新規ファイルに作成します。 また、ワークベンチは @Handler アノテーションをインターフェースに追加します。

手順

ハンドラー・クラスをインプリメンテーション・クラスから作成した後に、それを別個のファイルに配置するには、以下のようにします。

  1. パッケージ・エクスプローラーで、インターフェースが定義されているソース・ファイルを右クリックし、「pureQuery」 > 「ハンドラー・クラスの作成」を選択します。 「インターフェース用のハンドラー・クラスの作成」が開きます。
  2. ウィザードの制御を使用して、作成するハンドラー・クラスおよびそれを配置する Java プロジェクト内の場所を指定します。
  3. 「完了」をクリックします。 ハンドラー・クラスがプロジェクト内に表示されます。 インプリメンテーション・クラスから @generated タグを除去しなかった場合、 プロジェクトの次のビルドの際、ワークベンチはインプリメンテーション・クラスを再生成し、ハンドラー・クラスは組み込まれません。 このタグを除去すると、ワークベンチはインプリメンテーション・クラスを再生成しません。

例えば、インターフェースに次のアノテーション付きメソッドが入っているとします。
	@Select(sql = "SELECT PRODUCT_NUMBER, BASE_PRODUCT_NUMBER, INTRODUCTION_DATE,"
	               + "  DISCONTINUED_DATE, PRODUCT_TYPE_CODE, PRODUCT_COLOR_CODE, PRODUCT_SIZE_CODE,"
	               + "  PRODUCT_BRAND_CODE, PRODUCTION_COST, GROSS_MARGIN, PRODUCT_IMAGE"
	               + "  FROM GOSALES.PRODUCT")
	Iterator<Product> getProducts();

インターフェースのインプリメンテーション・クラスには、@generated タグおよびこのメソッドの以下のハンドラー・クラスが入っています。

  public static class GetProductsRowHandler extends BaseRowHandler<Product>
   {
     public Product handle (java.sql.ResultSet rs, Product returnObject) throws java.sql.SQLException
     {
       returnObject = new Product ();
       returnObject.setProduct_number(getInt (rs, 1));
       returnObject.setBase_product_number(getInt (rs, 2));
       returnObject.setIntroduction_date(getTimestamp (rs, 3));
       returnObject.setDiscontinued_date(getTimestamp (rs, 4));
       returnObject.setProduct_type_code(getInt (rs, 5));
       returnObject.setProduct_color_code(getInt (rs, 6));
       returnObject.setProduct_size_code(getInt (rs, 7));
       returnObject.setProduct_brand_code(getInt (rs, 8));
       returnObject.setProduction_cost(getBigDecimal (rs, 9));
       returnObject.setGross_margin(getDouble (rs, 10));
       returnObject.setProduct_image(getString (rs, 11));

       return returnObject;
     }
   }

「インターフェース用のハンドラー・クラスの作成」ウィザードを使用した後、ワークベンチは、ハンドラー・クラスが入るファイル GetProductsRowHandler.java を作成します。 ワークベンチは、ハンドラー・クラスのないインプリメンテーション・クラスも再生成します。 ハンドラー・クラスは直接編集することができ、編集のためにインプリメンテーション・クラスを開く必要はありません。

インターフェースのメソッドには @Handler アノテーションが入っています。

	@Handler(rowHandler=aforementioned.GetProductsRowHandler.class)
	@Select(sql = "SELECT PRODUCT_NUMBER, BASE_PRODUCT_NUMBER, INTRODUCTION_DATE,"
	               + "  DISCONTINUED_DATE, PRODUCT_TYPE_CODE, PRODUCT_COLOR_CODE, PRODUCT_SIZE_CODE,"
	               + "  PRODUCT_BRAND_CODE, PRODUCTION_COST, GROSS_MARGIN, PRODUCT_IMAGE"
	               + "  FROM GOSALES.PRODUCT")
	Iterator<Product> getProducts();

フィードバック