生成インプリメンテーション・クラスからのユーザー定義クラスの拡張

pureQuery ジェネレーターが生成するインプリメンテーション・クラスによって拡張されるクラスを作成できます。

このタスクについて

pureQuery Generator ユーティリティーは、アノテーション付きメソッドを宣言するインターフェースを実装するクラスと、Data インターフェースのインプリメンテーションを拡張するクラスの両方を生成します。通常、アプリケーションでは Data インターフェースの多くのメソッドにアクセスする必要はないので、特定のアノテーション付きメソッド・インターフェースのインプリメンテーション・クラスをインスタンス化する DataFactory 内のメソッドは、実行時にそうしたアノテーション付きメソッド・インターフェースのインスタンスを戻します。

例えば、そうした DataFactory メソッドの 1 つがインターフェース MyInterface のインプリメンテーションをインスタンス化する場合に、myObject がメソッドの戻り値に設定されていると、myObject の型は MyInterface になります。myObject 内で Data メソッドにアクセスするアプリケーションの場合には、アプリケーションが myObject を Data オブジェクトにキャストする必要があります。

pureQuery Generator ユーティリティーがインプリメンテーション・クラスを生成する際に、そのクラスは BaseData という名前の Data インターフェースのインプリメンテーションをデフォルトで拡張します。 ただし、このインプリメンテーション・クラスは、BaseData を拡張する別のクラスを拡張することもできます。

以下のいずれかの理由によって、インプリメンテーション・クラスでこれを行いたいこともあります。
  • 生成されたインプリメンテーション・クラスを Data 型としてキャストしなくても、そのクラス内にアクセス可能なメソッドが Data 内にいくつかある場合。
  • 別の名前で Data 内のいずれかのメソッドにアクセスする場合。
  • (インプリメンテーションによって生成させるのではなく) 自分で実装し、Generator ユーティリティーが生成するインプリメンテーション・クラスで使用可能なメソッドが少なくとも 1 つある場合。例えば、生成されたインプリメンテーションとは異なる仕方で実装を行うか、メソッドがアノテーション付きメソッドとして生成可能なメソッドではない場合には、メソッドを自分で実装することがあります。
重要: BaseData を拡張するクラスが、BaseData 内で実装されたメソッドをオーバーライドしてはなりません。

データ・オブジェクトはスレッド・セーフではありません。 それらは複数のスレッドで共用しないでください。 Data オブジェクトは、作成されたのと同じスレッドでのみ使用してください。

手順

Generator ユーティリティーが生成するインプリメンテーション・クラスからクラスを拡張する方法

  1. com.ibm.pdq.runtime.generator.BaseData を拡張し、生成されたインプリメンテーション・クラスで使用可能なメソッドを定義するクラスを作成します。
  2. インプリメンテーション・クラスを作成する対象となるインターフェースと、拡張するクラス名を指定して、pureQuery ジェネレーターを実行します。
    1. インプリメンテーション・クラスを生成する対象となるアノテーション付きメソッド・インターフェース名を指定します。
    2. pureQuery ジェネレーターの baseDataOverride オプションを使用して、拡張する生成済みインプリメンテーション・クラスのクラス名を指定します。

アノテーション付きメソッドを宣言するインターフェースに対して pureQuery ジェネレーターが生成するインプリメンテーション・クラスに、メソッドを追加するとします。追加メソッドは、以下の機能を実行します。
  • 異機種混合のバッチ
  • 「Bean」配列を戻す動的照会 SQL
  • 動的挿入、更新、削除の DDL SQL
メソッドが含まれる以下のインターフェースを作成します。
package customer;
public interface CommonInterface
{
  public void startHeterogeneousBatch (); // this method "renames" the Data Interface method
  public int[][] endHeterogeneousBatch (); // this method "renames" the Data Interface method
  public int dynamicSQLUpdate (String updateSQL, Object... parameters); // this method "renames" the Data Interface method
  public <T> T[] dynamicQueryArray (String sql, Class<T> returnClass, Object... parameters); // this method "renames" the Data Interface method
  public void commit ();
  public void rollback ();
  // 他の Data インターフェース・メソッドもここにコーディングできます。
}
このインターフェースを以下のクラスで実装します。
package customer;

public class BaseData extends com.ibm.pdq.runtime.generator.BaseData implements CommonInterface
{
  public <T> T[] dynamicQueryArray (String sql, Class<T> returnClass, Object... parameters)
  {
    return queryArray (sql, returnClass, parameters);
  }
  public int dynamicSQLUpdate (String updateSQL, Object... parameters)
  {
    return update (updateSQL, parameters);
  }
  public void startHeterogeneousBatch ()
  {
    startBatch (heterogeneousModify__);
    return;
  }
  public int[][] endHeterogeneousBatch ()
  {
    return endBatch ();
  }
}

このクラスは、com.ibm.pdq.runtime.generator.BaseData を拡張することに注意してください。

ここで、アノテーション付きメソッドを宣言するインターフェースを作成するとします。
import com.ibm.pdq.annotation.Update;

public interface AutoGeneratedKeysInterface
{
  @Update(sql = "insert into MYEMPLOYEE (name, salary, deptno) values(:name, :salary, :deptno)")
  int createEmployee (MyEmployeeBean bean);
}
このインターフェースを変更して、CommonInterface を拡張できるようにします。
import com.ibm.pdq.annotation.Update;

public interface AutoGeneratedKeysInterface extends customer.CommonInterface
{
  @Update(sql = "insert into MYEMPLOYEE (name, salary, deptno) values(:name, :salary, :deptno)")
  int createEmployee (MyEmployeeBean bean);
}

pureQuery ジェネレーターを使用してこのインターフェースのインプリメンテーション・クラスを生成する場合、オプション baseDataOverride に customer.BaseData を指定します。


フィードバック