インライン・メソッドを定義する Data インターフェースには、Connection オブジェクトに対する複数の JDBC メソッドが含まれます (close()、commit()、rollback()、setAutoCommit()、および getAutoCommit() など)。 これらのメソッドは、pre() および post() メソッドと一緒にブラケットで囲むことはできません。
例えば、sendFormLetter() アノテーション付きメソッドには、使用する定型レターを識別するコードを提供する int パラメーターがあります。 さらにメソッドには、定型レターに入力する情報および定型レターをメールするための都市、都道府県、および郵便コードを提供する String パラメーターもあります。 最後に、sendFormLetter() メソッドは、レターを印刷して送信するかどうかを追跡する表を更新します。
sendFormLetter() メソッドを呼び出すアプリケーションが、都市、都道府県、または郵便番号を提供しないか、あるいはおそらく 3 つすべてではなく、それらのうちの 2 つを提供するとします。 3 つすべての値が存在するかどうかを調べるアプリケーション・ロジックを書こうと考えていますが、データベース内でこれを簡単に行うことはできません。また、sendFormLetter() メソッドの定義でこれを行うこともできません。そのアプリケーション・ロジックを書くことのできる場所の 1 つは、以下のように定義できる Hook 内です。
import com.ibm.pdq.runtime.statement.*; 1 public class ZipHook implements Hook { public void pre ( 2 String methodName, Data dataInstance, SqlStatementType sqlStatementType, Object... parameters) { if (methodName.startsWith( "sendFormLetter(int, java.lang.String")) { // right method; params 2,3, & 4 are city, state, zip if (parameters[1] == null || parameters[2] == null || parameters[3] == null) { ... 3 } } } public void post ( 4 String methodName, Data dataInstance, Object returnValue, SqlStatementType sqlStatementType, Object... parameters) { return; // no action } }
sendFormLetter() メソッドがインターフェース com.company.NotSpam で定義されている場合、Hook ZipHook のインスタンスと sendFormLetter() メソッドの使用を関連付けるアプリケーション・ロジックは以下のようになります。
Connection con = DriverManager.getConnection(...); 1 ZipHook zHook = new ZipHook(); 2 Data db = DataFactory.getData(NotSpam.class, con, zHook); 3
このコードは、以下のステップを実行します。