錯誤示範
String sql = "select userid from users where username='...'; select jztypeid from jztype where jztypename='...'";
pstmt = conn.prepareStatement(sql);
int userid = pstmt.executeUpdate(); // 錯誤:SELECT 不能用 executeUpdate
正確做法:分開執行或使用多結果集
方案一:分兩個 Statement(最清晰)
try (PreparedStatement ps1 = conn.prepareStatement("SELECT userid FROM users WHERE username=?")) {
ps1.setString(1, username);
try (ResultSet rs = ps1.executeQuery()) {
if (rs.next()) userid = rs.getInt("userid");
}
}
try (PreparedStatement ps2 = conn.prepareStatement("SELECT jztypeid FROM jztype WHERE jztypename=?")) {
ps2.setString(1, jztype);
try (ResultSet rs = ps2.executeQuery()) {
if (rs.next()) typeid = rs.getInt("jztypeid");
}
}
方案二:單一 Statement 多結果集(需資料庫支援)
Statement stmt = conn.createStatement();
stmt.execute("SELECT userid FROM users WHERE username='...'; SELECT jztypeid FROM jztype WHERE jztypename='...'");
ResultSet rs1 = stmt.getResultSet(); // 第一個查詢結果
if (rs1.next()) userid = rs1.getInt(1);
if (stmt.getMoreResults()) {
ResultSet rs2 = stmt.getResultSet();
if (rs2.next()) typeid = rs2.getInt(1);
}
關鍵 API 對照
| 方法 | 用途 | 回傳 |
| executeQuery() | SELECT | ResultSet |
| executeUpdate() | INSERT/UPDATE/DELETE | 影響行數 |
| execute() | 任意 SQL / 多結果集 | boolean (是否有 ResultSet) |
最佳實務
- 優先使用
PreparedStatement 防 SQL Injection。
- 使用 try-with-resources 自動關閉資源。
- 單一職責:一個查詢一個 Statement,除非效能極度敏感。