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

Java EE 中 SQL 自動構造實戰:基於表單命名規約的通用方案

     編輯:Java 相關知識

痛點:手工拼 SQL 的低效與隱患

Web 開發中 INSERT/DELETE/UPDATE 無處不在。手工拼接 SQL 不僅工作量大,還面臨:字段遺漏、單引號轉義遺漏、類型處理不當(字符串需加引號、數值/函數不需)、維護成本高等問題。

核心思路:約定優於配置,命名規約驅動自動生成

利用 request.getParameterNames() 獲取所有表單元素,約定命名前綴區分語義與類型:

前綴語義處理邏輯
c_公共參數c_table 表名、c_genre 操作類型、c_where WHERE 條件
s_字符串字段自動加單引號,內部單引號轉義為兩個單引號
i_非字符串字段整數、浮點、數據庫函數(now()、to_date())直接拼接,空值轉 NULL

核心代碼實現(PageUtil.java)

public String getSQL(HttpServletRequest request) {
    String c_table = get("c_table");
    String c_genre = get("c_genre");
    String c_where = get("c_where");
    // 校驗必填參數...
    if ("INSERT".equalsIgnoreCase(c_genre)) {
        // 遍歷參數,按 s_/i_ 前綴構建 colstr、valstr
        // 字符串自動處理 ' → ''
        return "INSERT INTO " + c_table + " (" + colstr + ") VALUES (" + valstr + ")";
    } else if ("UPDATE".equalsIgnoreCase(c_genre)) {
        // 構建 SET 子句
        return "UPDATE " + c_table + " SET " + colstr + (c_where.isEmpty()?"":" WHERE "+c_where);
    } else if ("DELETE".equalsIgnoreCase(c_genre)) {
        return "DELETE FROM " + c_table + (c_where.isEmpty()?"":" WHERE "+c_where);
    }
    return null;
}

完整代碼包含參數獲取、空值處理、單引號轉義、字符串拼接優化等細節,可直接作為 JavaBean 複用。

優勢與代價

  • ✅ 大幅減少樣板代碼,字段自動對應、類型自動處理、單引號零遺漏
  • ✅ 表單與邏輯解耦:修改表結構只需改表單命名,業務代碼不動
  • ✅ 可擴展:配合自動執行 SQL 的基類,增刪改映射到同一 Action
  • ⚠️ 性能損耗:遍歷所有參數、字符串操作,極大量表單(百字段級)可感知;常規業務可接受

適用場景

後台管理、報表配置、動態表單等「字段多、變更頻、業務邏輯簡單」的 CRUD 密集型模塊。核心交易、複雜業務邏輯仍建議顯式寫 DAO/SQL。

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