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

輕量級數據管理分析平台實戰:JDBC + Applet + 動態 SQL 模板 + 客戶端可更新 ResultSet

     編輯:Java 相關知識

業務背景:多維度、高變頻、需自助分析

電力行業按地域/時間/類別管理電量負荷數據。核心痛點:

  • 維度固定(地域、時間、口徑),但指標列頻繁增減(隨產業結構、政策變化)
  • 不同地市關注指標集合不同,需動態增減管理表
  • 需支持權限控制下的增刪改查、關聯計算自動維護(如人均 GDP = GDP/人口)、所見即所得圖表分析
  • 跨數據庫平台(Oracle、DB2、MySQL、Derby...)

架構決策:為什麼選 JDBC + Applet?

核心技術棧

  • 服務端:Servlet + JDBC (RowSet / ResultSet)
  • 客戶端:嵌入 JSP 的 Swing Applet (JFreeChart 繪圖)
  • 通信:HTTP + Java 序列化傳輸 ResultSet 包裝對象
  • 配置驅動:XML 定義模板 SQL、顯示/隱藏列、關聯計算類

關鍵創新:模板 SQL 與動態 WHERE 子句

基礎查詢:人口統計範例


-- 物理表
AREA(AREAID PK, AREANAME)
POPULATION(AREAID PK FK, YEAR PK, TOTAL, MEN, WOMEN, CITY, COUNTRY)

-- 模板 SQL (配置文件中)
SELECT A.AREANAME, B.AREAID, B.YEAR, B.TOTAL, B.MEN, B.WOMEN, B.CITY, B.COUNTRY
FROM AREA A, POPULATION B
WHERE A.AREAID = B.AREAID AND B.@area AND B.@year

@area、@year 為替換標記,運行時根據 UI 選擇動態替換:

  • 單地域:B.AREAID = ?
  • 多地域對比:B.AREAID IN (?,?)
  • 時間範圍:B.YEAR BETWEEN ? AND ?

隱藏主鍵列技巧

查詢必須包含目標表主鍵(POPULATION.AREAID, YEAR)以支持後續更新,但 UI 不展示。配置 hiddenColumns=AREAID,YEAR,客戶端 Applet 解析時隱藏但保留行關聯。

客戶端可更新 ResultSet 實現

服務端:序列化傳輸


// FakeServlet 接收 Applet 請求
public class FakeServlet {
    public void service(AppletRequest req, AppletResponse resp) {
        DMDataWrapper wrapper = (DMDataWrapper) req.getInputStream().readObject();
        // 解析 wrapper 中的 insert/update/delete 記錄
        // 生成標準 SQL 批量執行
        // 返回更新後的 ResultSet 重新序列化
    }
}

客戶端:Swing TableModel 封裝

  • 表格單元格編輯 → 記錄 RowChange(oldVal, newVal, rowPkMap)
  • 刪除行 → 記錄主鍵值
  • 新增行 → 彈出下拉框選外鍵(地域)、自動生成代理主鍵
  • 提交時發送 DMDataWrapper 含所有變更

關聯數據一致性:Java 類替代表觸發器

問題:修改 POPULATION.TOTAL 需自動重算 ECONOMIC.PER_CAPITA_GDP。

方案:配置 statClass=com.example.stats.PopulationGdpSync,實現統一介面:


public interface StatCalculator {
    void afterUpdate(String tableName, Map oldRow, Map newRow);
}

服務端解析配置 → 反射實例化 → 更新提交後調用。優勢:跨庫、業務邏輯集中、可熱部署。

架構圖解

[Applet UI: JTable + JFreeChart] 
      │ HTTP + 序列化
[Servlet: FakeServlet / 真實 Servlet]
      │ JDBC
[Database: Derby / Oracle / MySQL]

類圖核心:DataManager(Applet) ↔ FakeServlet ↔ Database ↔ DMDataWrapper(變更記錄)

參考實現運行效果

  • 啟動:java -jar DataAnalyse.jar (內嵌 Derby、自建表示例數據)
  • 界面:左側地域樹、頂部時間/類別篩選、中部可編輯表格、右側即時圖表
  • 操作:雙擊單元格修改、右鍵刪除行、工具欄新增行、拖選區域生成圖表
  • 配置熱修改:直接編輯配置表,重啟生效

優勢與局限性誠實分析

方案致命缺陷
POJO + ORM (Hibernate)新增指標需新增 Entity、映射、DAO、Service、Action、JSP —— 全鏈路代碼生成,非「配置」
表單提交 + 手寫 SQL工作量隨指標線性增長,維護噩夢
數據庫視圖 + 直接更新視圖更新能力跨數據庫差異巨大,喪失平台無關性
JDBC + 模板 SQL + 客戶端可更新 ResultSet✅ 通過標準 JDBC 實現跨庫、動態列、可更新結果集、零代碼生成
優勢局限
新增指標/表僅需配置,零代碼、零部署基於 JDBC 直接改表,與 ORM 二級緩存不兼容
自帶圖表分析,配置即得離線樂觀鎖模式:高併發/重疊編輯場景有覆蓋風險
跨數據庫平台,僅換驅動包不適合海量匿名併發訪問系統
客戶端豐富交互(Swing),超越 HTML 表單Applet 技術逐漸淘汰,現代可改用 JavaFX/WebSocket/React

現代化演進建議

  1. 客戶端:Applet → Java Web Start / JavaFX / Electron / React + WebSocket
  2. 通信:序列化 → JSON/Protobuf + REST/gRPC
  3. 服務端:Servlet → Spring Boot + MyBatis 動態 SQL / jOOQ
  4. 併發控制:增加版本號/時間戳樂觀鎖、或引入 OT/CRDT 協同編輯

總結

該平台證明了「JDBC 元數據 + 模板 SQL + 客戶端可更新結果集」是構建低代碼數據管理平台的可行路徑。核心洞見:將「列增減」視為一等公民配置項,而非代碼變更。雖然 Applet 已退出歷史舞臺,但架構思想在低代碼平台、BI 自助分析、動態表單引擎中依然閃耀。

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