| 方案 | 致命缺陷 |
| POJO + ORM (Hibernate) | 新增指標需新增 Entity、映射、DAO、Service、Action、JSP —— 全鏈路代碼生成,非「配置」 |
| 表單提交 + 手寫 SQL | 工作量隨指標線性增長,維護噩夢 |
| 數據庫視圖 + 直接更新 | 視圖更新能力跨數據庫差異巨大,喪失平台無關性 |
| JDBC + 模板 SQL + 客戶端可更新 ResultSet | ✅ 通過標準 JDBC 實現跨庫、動態列、可更新結果集、零代碼生成 |
核心技術棧
- 服務端: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、自建表示例數據)
- 界面:左側地域樹、頂部時間/類別篩選、中部可編輯表格、右側即時圖表
- 操作:雙擊單元格修改、右鍵刪除行、工具欄新增行、拖選區域生成圖表
- 配置熱修改:直接編輯配置表,重啟生效
優勢與局限性誠實分析
| 優勢 | 局限 |
| 新增指標/表僅需配置,零代碼、零部署 | 基於 JDBC 直接改表,與 ORM 二級緩存不兼容 |
| 自帶圖表分析,配置即得 | 離線樂觀鎖模式:高併發/重疊編輯場景有覆蓋風險 |
| 跨數據庫平台,僅換驅動包 | 不適合海量匿名併發訪問系統 |
| 客戶端豐富交互(Swing),超越 HTML 表單 | Applet 技術逐漸淘汰,現代可改用 JavaFX/WebSocket/React |
現代化演進建議
- 客戶端:Applet → Java Web Start / JavaFX / Electron / React + WebSocket
- 通信:序列化 → JSON/Protobuf + REST/gRPC
- 服務端:Servlet → Spring Boot + MyBatis 動態 SQL / jOOQ
- 併發控制:增加版本號/時間戳樂觀鎖、或引入 OT/CRDT 協同編輯
總結
該平台證明了「JDBC 元數據 + 模板 SQL + 客戶端可更新結果集」是構建低代碼數據管理平台的可行路徑。核心洞見:將「列增減」視為一等公民配置項,而非代碼變更。雖然 Applet 已退出歷史舞臺,但架構思想在低代碼平台、BI 自助分析、動態表單引擎中依然閃耀。
- 上一篇文章: Sun SPOT 實戰:打造持續集成構建監視器——從金絲雀靈感到無線 LED 可視化
- 下一篇文章: 電商促銷引擎的「業務公式化」實踐:自定義公式系統設計與落地
Copyright ©
程式碼之家 All Rights Reserved