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

在 Java 集合上實現類 SQL SELECT 查詢功能

     編輯:Java 相關知識

背景動機

在日常開發中,我們經常需要對對象集合進行篩選、投影、排序等操作,這與 SQL 對關係表的 SELECT 操作極其相似。本文介紹一種通用機制,讓開發者能在 Java 對象數組或 Collection 上直接使用類 SQL 的查詢語義,實現屬性選擇、條件過濾、結果排序,且不修改原始數據源。

核心設計:接口與類結構

整個機制由七個核心接口/類組成,各司其職:

組件職責
Invoker封裝方法調用,單一方法 boolean invoke(Object o),用於提取對象屬性值
Condition封裝過濾邏輯,單一方法 boolean passes(Object o),判斷對象是否滿足條件
SelectInstruction對應 SELECT 子句中的單個列,包含列名與 Invoker,數組形式構成完整投影列表
OrderInstruction對應 ORDER BY 子句單項,包含 Invoker(提取排序鍵)與 Comparator(比較策略),數組順序決定優先級
SelectStatement封裝完整查詢語句:數據源、投影列表、條件列表、排序列表
Executor執行引擎,接收 SelectStatement 並返回 ResultTable
ResultTable結果集容器,內部以 Object[][] 存儲,便於轉換顯示

協作流程

  1. 構建數據源(任意類型對象的數組或 Collection)
  2. 定義 SelectInstruction[] 指定輸出列及別名
  3. 定義 Condition[] 表達 WHERE 條件
  4. 定義 OrderInstruction[] 表達 ORDER BY 排序規則
  5. 將以上封裝進 SelectStatement
  6. 調用 Executor.execute(statement) 獲取 ResultTable

關鍵特性解析

靈活的投影

每個 SelectInstruction 綁定一個 Invoker,執行時對源對象逐個調用,返回值作為該列單元格值。若列名為 *,則自動包裝該類所有 getter 方法。

解耦的過濾

Condition 接口將業務規則與查詢引擎分離,開發者只需實現 passes() 即可表達任意複雜條件。無條件時傳入空數組。

多級排序

OrderInstruction 組合 Invoker 與 Comparator,若無自定義比較器則回退至 Comparable 自然順序。數組順序即優先級順序。

優勢總結

  • 非侵入式:不修改原始集合,支持同一數據源的多種視圖
  • 高性能:單次遍歷完成篩選、投影、排序,結果快速產出
  • 可擴展:各子句獨立封裝,易於復用組合,產生乾淨代碼

使用建議

雖然機制基於通用接口靈活強大,但濫用可能導致代碼難以維護。建議在報表導出、動態查詢界面、臨時數據分析等場景使用;核心業務邏輯仍推薦使用 Stream API 或專用查詢庫(如 JSQLParser、QueryDSL)以獲得類型安全與 IDE 支持。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved