首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

DatabaseFilter 學習筆記:動態查詢條件與排序實作

     編輯:Java 相關知識

前言

DatabaseFilter 是一種用於封裝動態 SQL 查詢條件 (WHERE) 與排序 (ORDER BY) 的工具類,常見於 JSF/ADF 或自製資料存取層。本文記錄如何建立控制項、構建 FilterTerm 與 SortTerm,並透過頁面流 (JPF) 實現多條件查詢與結果顯示。

資料庫控制項定義

以註解方式定義 SQL,參數為 DatabaseFilter:

/** @jc:sql command-type="grid"
 * rowset-name="B_CANTONRowSet"
 * max-rows="1000"
 * statement="SELECT CANTON_ID, PLACENAME, ZIP... FROM HAPPYTREE.HT_B_CANTON {sql: filter.getWhereClause()} {sql: filter.getOrderByClause()}"
 */
public RowSet getAllBCanton(DatabaseFilter filter) throws SQLException;

頁面流實作步驟

1. 查詢條件輸入頁

簡單表單提交至 action="select"。

2. 結果顯示頁

Grid 組件綁定查詢回傳的 RowSet。

3. 動作方法構建 Filter

/** @jpf:action @jpf:forward name="success" path="grid.jsp" */
protected Forward select(DatabaseForm form) {
    SortFilterService sortFilterService = SortFilterService.getInstance(getRequest());
    DatabaseFilter filter = new DatabaseFilter();
    List<DatabaseFilter.FilterTerm> list = new ArrayList<>();

    // 條件 1: canton_id 大於輸入值
    DatabaseFilter.FilterTerm query = new DatabaseFilter.FilterTerm();
    query.sColumnName = "canton_id";
    query.op = DatabaseFilter.opGreater;
    query.value = form.getCanton_id();
    list.add(query);

    // 可繼續添加多條件...
    // DatabaseFilter.FilterTerm query2 = ...; list.add(query2);

    // 轉陣列
    DatabaseFilter.FilterTerm[] terms = list.toArray(new DatabaseFilter.FilterTerm[0]);

    // 排序設定
    DatabaseFilter.SortTerm[] sterms = new DatabaseFilter.SortTerm[1];
    sterms[0] = new DatabaseFilter.SortTerm();
    sterms[0].sColumnName = "placename";
    sterms[0].op = DatabaseFilter.opDesc;

    filter = new DatabaseFilter(terms, sterms);

    try {
        allRows = myControl.getAllBCanton(filter);
    } catch (Exception e) { e.printStackTrace(); }

    return new Forward("success", new DatabaseForm());
}

核心類別結構

  • DatabaseFilter.FilterTerm:單一查詢條件 (欄位、運算子、值)
  • DatabaseFilter.SortTerm:單一排序規則 (欄位、升/降序)
  • DatabaseFilter:封裝條件陣列與排序陣列,自動生成 WHERE/ORDER BY 子句

常用運算子常數

常數含義
opEqual=
opNotEqual!=
opGreater>
opLess<
opLikeLIKE
opIsNullIS NULL
opIsNotNullIS NOT NULL

優缺點與注意事項

優點注意
條件與排序物件化,避免 SQL 字串拼接風險屬於特定框架 (如 BEA WebLogic Workshop/JPF) 專用 API,非標準 JDBC
支援多條件組合、動態排序需確認底層 SQL 生成邏輯防止注入,雖然通常已處理參數化
與頁面流、表單 Bean 整合良好遷移至其他框架需重寫查詢條件構建邏輯

擴充建議

  1. 封裝通用 QueryBuilder 介面,支援多種 Filter 實作
  2. 加入分頁參數 (offset, limit) 整合至 Filter
  3. 提供 Criteria API 風格鏈式呼叫:filter.where("id").gt(100).and("name").like("A%")
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved