생성된 구현 클래스에서 사용자 정의 클래스 확장

pureQuery Generator가 생성하는 구현 클래스에 의해 확장되는 클래스를 작성할 수 있습니다.

이 태스크 정보

pureQuery Generator 유틸리티는 어노테이션이 있는 메소드를 선언하는 인터페이스를 구현하고 Data 인터페이스의 구현을 확장하는 클래스를 생성합니다. 애플리케이션은 일반적으로 Data 인터페이스의 여러 메소드에 액세스할 필요가 없으므로 런타임 시 특정 어노테이션이 있는 메소드 인터페이스에 대한 구현 클래스를 인스턴스화하는 DataFactory의 메소드는 해당 인터페이스의 인스턴스를 리턴합니다.

예를 들어, 이러한 DataFactory 메소드 중 하나가 인터페이스 MyInterface의 구현을 인스턴스화하고 myObject가 메소드의 리턴 값으로 설정되는 경우, myObject의 유형은 MyInterface입니다. 애플리케이션이 myObject의 Data 메소드에 액세스하려면 애플리케이션이 myObject를 Data 오브젝트에 캐스트해야 합니다.

pureQuery Generator 유틸리티가 구현 클래스를 생성하는 경우, 기본으로 해당 클래스는 BaseData로 이름 지정된 Data 인터페이스의 구현을 확장합니다. 그러나 구현 클래스는 자체적으로 BaseData를 확장하는 다른 클래스를 확장할 수 있습니다.

구현 클래스를 사용하는 목적으로 다음과 같은 이유를 들 수 있습니다.
  • 클래스를 Data 유형으로 캐스트하지 않고 생성된 구현 클래스에서 액세스하고자 하는 메소드가 Data에 있습니다.
  • Data의 메소드 중 하나에 다른 이름으로 액세스하려고 합니다.
  • 직접 구현하고(생성된 구현을 갖는 대신) Generator 유틸리티가 생성하는 구현 클래스에서 사용 가능하기를 원하는 메소드가 둘 이상 있습니다. 예를 들어, 구현이 생성된 구현과 다르기를 원하거나 메소드가 어노테이션이 있는 메소드로 생성될 수 있는 메소드가 아닌 경우 메소드를 직접 구현하려고 할 수 있습니다.
주의: BaseData를 확장하는 클래스는 BaseData에서 구현된 모든 메소드를 겹쳐쓰지 않아야 합니다.

데이터 오브젝트는 스레드 안전 상태가 아닙니다. 여러 스레드에서 공유하지 마십시오. Data 오브젝트가 작성된 동일한 스레드에서만 사용하십시오.

프로시저

Generator 유틸리티가 생성한 구현 클래스에서 클래스를 확장하려면 다음을 수행하십시오.

  1. com.ibm.pdq.runtime.generator.BaseData를 확장하고 생성된 구현 클래스에서 사용할 수 있기를 원하는 메소드를 정의하는 클래스를 작성하십시오.
  2. pureQuery Generator를 실행하여 구현 클래스를 작성하려는 대상 인터페이스 및 확장하려는 클래스의 이름을 제공하십시오.
    1. 구현 클래스를 생성하려는 어노테이션이 있는 메소드 인터페이스의 이름을 제공하십시오.
    2. pureQuery Generator의 baseDataOverride 옵션을 사용하여 생성된 구현 클래스가 확장하기를 원하는 클래스의 이름을 제공하십시오.

어노테이션이 있는 메소드를 선언하는 인터페이스에 대해 pureQuery Generator가 생성하는 구현 클래스에 메소드를 추가하려는 경우를 가정하십시오. 추가 메소드는 다음과 같은 기능을 수행합니다.
  • 이기종 일괄처리
  • "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 ();
  // any other Data Interface method can be coded here also
}
다음 클래스를 사용하여 이 인터페이스를 구현합니다.
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 Generator를 사용하여 이 인터페이스에 대한 구현 클래스를 생성하는 경우, baseDataOverride 옵션에 customer.BaseData를 지정합니다.


피드백