| 維度 | 內聯風格 (Inline) | 註解方法風格 (Annotated Method) |
|---|---|---|
| SQL 定義位置 | 運行時字符串傳遞給 Data 接口 | 開發時作為 Java 5 註解 (@Select/@Update/@Call) 附著於接口方法 |
| 核心目標 | 快速開發、動態執行、JDBC 程序員友好 | 配置性、安全性、靜態 SQL 支持、命名查詢範式 |
| 靜態 SQL | 不支持 | 部署選項決定,代碼無需修改 |
| 代碼生成 | 無 | 預處理接口生成實現類 |
InterfaceImpl)。DataFactory.getData(Interface.class, connection) 獲取實例調用。
package com.ibm.db2.pureQuery;
import java.util.Iterator;
import com.ibm.pdq.annotation.Select;
public interface CustomerData {
@Select(sql="SELECT CID, NAME, COUNTRY, STREET, CITY, PROVINCE, ZIP, PHONE, INFO FROM PDQ_SC.CUSTOMER")
Iterator getCustomers();
@Select(sql="SELECT CID, NAME, COUNTRY, STREET, CITY, PROVINCE, ZIP, PHONE, INFO FROM PDQ_SC.CUSTOMER WHERE CID = ?")
Customer getCustomer(int cid);
// @Update/@Call 類似
}
CustomerDataImpl,實現用戶接口,繼承內部 BaseData (實現 Data 接口)。StatementDescriptor (SQL 元數據)、RowHandler/ResultHandler (結果映射)、ParameterHandler (參數綁定)。
Connection con = ...;
CustomerData cd = DataFactory.getData(CustomerData.class, con);
Iterator customers = cd.getCustomers(); // 自動執行 SQL、映射結果、返回 Iterator
Customer c = cd.getCustomer(123);
public class TrackingHook implements Hook {
public void pre(String methodName, Data instance, SqlStatementType sqlType, Object... params) {
System.out.println(methodName + " **Customer data accessed**");
}
public void post(String methodName, Data instance, Object returnValue, SqlStatementType sqlType, Object... params) {
// 後處理:日誌、審計、緩存失效等
}
}
// 註冊
CustomerData cd = DataFactory.getData(CustomerData.class, con, new TrackingHook());
參數提供上下文感知:方法名、SQL 類型、運行時參數、返回值,支持靈活的 AOP 風格擴展。
在 @Update 方法聲明集合類型參數,pureQuery 引擎自動識別並生成批量執行邏輯,單條 SQL 多參數集執行,大幅提升吞吐。
@GeneratedKey 註解Bean 字段標註 @GeneratedKey,插入/更新後數據庫生成的主鍵/序列值自動回填至 Bean 對象,省去手工查詢。
場景:同一應用部署至不同 Schema 的遺留數據庫 (列名差異:CID vs CUSTID、PROVINCE vs PROV)。
生成器讀取 XML 產出差異化實現,Java 接口與 Bean 完全復用,實現「一次開發、多庫部署」。
CustomerData、OrderData),單一職責。Impl 類納入版本庫,確保構建可重現。pureQuery 註解方法風格以「接口即契約、註解即 SQL、生成即實現」的模式,將數據訪問層提升至領域建模層面。靜態/動態 SQL 部署時決策、Hook 橫切擴展、XML 多目標隔離等特性,精準解決企業級應用在安全合規、異構遷移、性能調優中的長期痛點,是 JDBC 之上的現代化數據訪問最佳實踐之一。