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

JDBC 指南:PreparedStatement 預編譯陳述式完整攻略

     編輯:關於JSP

PreparedStatement 核心優勢

PreparedStatement 繼承自 Statement,具備兩大關鍵特性:

  1. 預編譯 SQL:建立物件時即將 SQL 送至資料庫編譯,後續重複執行無需再次解析,效能顯著優於 Statement。
  2. 參數化查詢:SQL 中以 ? 佔位符代表 IN 參數,執行前透過 setXXX 方法綁定具體值,有效防止 SQL 注入。

建立與基本用法

PreparedStatement pstmt = con.prepareStatement(
    "UPDATE table4 SET m = ? WHERE x = ?");
pstmt.setLong(1, 123456789);
pstmt.setLong(2, 100000000);
int rows = pstmt.executeUpdate();

參數索引從 1 開始。設定完成後可重複執行,直到呼叫 clearParameters() 清除。

批次執行範例

pstmt.setString(1, "Hi");
for (int i = 0; i < 10; i++) {
    pstmt.setInt(2, i);
    pstmt.executeUpdate();
}

前提:資料庫/驅動程式在提交後仍保持陳述式開啟,否則無法發揮效能優勢。

資料型別一致性與可攜性

setXXX 的 XXX 為 Java 型別,驅動程式會依標準映射轉為對應 JDBC 型別(如 short → SMALLINT)。開發者需確保 Java 型別映射的 JDBC 型別與資料庫欄位相容。為了最大可攜性,建議使用與目標 JDBC 型別完全對應的 Java 型別(如需 SMALLINT 請用 setShort 而非 setByte)。

setObject 進階用法

setObject(int idx, Object val, int targetSqlType) 可顯式指定目標 JDBC 型別(java.sql.Types 常數),適用於:

  • 編譯期不確定參數型別的通用應用
  • 需傳遞資料庫特有抽象型別(如結構化型別)

若省略第三參數,驅動程式會依物件型別使用預設映射(參見 JDBC 規範 8.6.4 節對照表)。

傳遞 NULL 值

  • setNull(int idx, int sqlType):必須指定 SQL 型別
  • 對接受物件的 setXXX 傳入 Java null 同樣會送出 JDBC NULL
  • setObject 傳 null 時必須指定目標 SQL 型別

大型參數流式傳輸

對於超大 BLOB/CLOB 參數,可使用輸入流分塊傳送:

  • setBinaryStream(idx, InputStream, length):二進位位元組流
  • setAsciiStream(idx, InputStream, length):ASCII 字元流
  • setUnicodeStream(idx, InputStream, length):Unicode 字元流

必須指定流總長度(某些資料庫需預知傳輸大小)。

File file = new File("/tmp/data");
try (InputStream fin = new FileInputStream(file)) {
    PreparedStatement pstmt = con.prepareStatement(
        "UPDATE Table5 SET stuff = ? WHERE index = 4");
    pstmt.setBinaryStream(1, fin, file.length());
    pstmt.executeUpdate();
}

執行時驅動程式會反覆讀取流內容直到 EOF。

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