錯誤代碼
String sql = "SELECT * FROM user WHERE name=? AND sex=?"; // 正確
// 但實際執行時打印發現:
// SELECT * FROM user WHERE name=? AND sex=? ← 沒問題
// 若報錯 near '? and sex=?',說明 SQL 字符串本身有問題
排查步驟
- 執行前打印 SQL:
System.out.println(sql); 確認無拼接、無多餘引號。
- 直接在數據庫客戶端跑打印出的 SQL(替換 ? 為實值)驗證語法。
- 檢查表名、列名是否為保留字(需反引號)。
- 確認
pstat.executeQuery() 無參重載:
rs = pstat.executeQuery(); // 不傳 sql 參數
傳參版 executeQuery(String sql) 是 Statement 的,PreparedStatement 不能再傳 SQL,否則會把 ? 當字面量執行。
正確調用鏈
String sql = "SELECT * FROM user WHERE name=? AND sex=?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, name);
ps.setString(2, sex);
try (ResultSet rs = ps.executeQuery()) { // 無參
...
}
}