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
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 | 預編譯複用、批量高效 |
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 開發的標準姿勢。