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

JDBC PreparedStatement 執行多條 SELECT 語句並正確取得 ResultSet 的標準寫法

     編輯:程式設計綜合問答

錯誤示範

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()SELECTResultSet
executeUpdate()INSERT/UPDATE/DELETE影響行數
execute()任意 SQL / 多結果集boolean (是否有 ResultSet)

最佳實務

  • 優先使用 PreparedStatement 防 SQL Injection。
  • 使用 try-with-resources 自動關閉資源。
  • 單一職責:一個查詢一個 Statement,除非效能極度敏感。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved