首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java JDBC 連接 MySQL:database 關鍵字轉義與 SQL 注入防範

     編輯:程式設計綜合問答

錯誤現象

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'database='88' where id='1001'' at line 1

根因

  1. `database` 是 MySQL 保留關鍵字,作為列名必須用反引號 `` `database` `` 轉義。
  2. 字符串拼接 SQL 導致注入風險,且 `id` 若為數值型不應加引號。

修正代碼

方案一:PreparedStatement(推薦)

String sql = "UPDATE student SET math=?, english=?, computer=?, `database`=? WHERE id=?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
    ps.setInt(1, math);
    ps.setInt(2, english);
    ps.setInt(3, computer);
    ps.setInt(4, database);
    ps.setInt(5, id); // 假設 id 為數值型
    ps.executeUpdate();
}

方案二:手動轉義(不推薦生產環境)

String sql = "UPDATE student SET math=" + math + ", english=" + english + 
             ", computer=" + computer + ", `database`=" + database + " WHERE id=" + id;
stmt.executeUpdate(sql);

關鍵點對比

做法SQL 注入關鍵字處理類型安全性能
字符串拼接高風險手動加反引號無無法複用執行計劃
PreparedStatement無風險自動處理強類型 setXxx預編譯複用、批量高效

最佳實踐清單

  • ✅ **永遠使用 `PreparedStatement`** 拼接 SQL。
  • ✅ 列名/表名含關鍵字或特殊字符,**統一加反引號** `` `col_name` ``。
  • ✅ 數值型字段 **不要加引號**,`setInt`/`setLong` 自動處理。
  • ✅ 使用 `try-with-resources` 自動關閉 `Connection`/`Statement`/`ResultSet`。
  • ✅ 連接池:HikariCP / Druid,生產環境禁用 `DriverManager.getConnection`。
  • ✅ 事務控制:`conn.setAutoCommit(false)` → 業務邏輯 → `commit()`/`rollback()`。

常見保留字速查

database, index, key, order, group, select, insert, update, delete, 
user, password, table, column, reference, primary, unique, check

完整列表見 MySQL 官方文檔《Keywords and Reserved Words》。

總結

報錯 `near 'database='88''` 直接指向 **未轉義關鍵字**。改用 `PreparedStatement` + 反引號 `` `database` ``,同時消除注入隱患、類型錯誤、性能損耗,是 Java JDBC 開發的標準姿勢。

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