| PostgreSQL 7.4 文檔 | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 31. JDBC 接口 | Fast Forward | Next |
在任何你想向數據庫運行一個SQL語句的時候, 你都需要一個Statement 或 PreparedStatement 實例。 一旦你擁有了一個Statement 或 PreparedStatement,你就可以發出一個查詢。 這樣將返回一個ResultSet 實例, 在其內部包含整個結果。Example 31-1 演示了這個過程。
Example 31-1. 在 JDBC 裡處理一個簡單的查詢
這個例子將發出一個簡單的查詢然後用一個 Statement 打印出每行的第一個字段。
Statement st = db.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");
while (rs.next()) {
System.out.print("Column 1 returned ");
System.out.println(rs.getString(1));
}
rs.close();
st.close();
這個例子將使用 PreparedStatement 發出和前面一樣的查詢,並且在查詢中綁定數值。
int foovalue = 500;
PreparedStatement st = db.prepareStatement("SELECT * FROM mytable WHERE columnfoo = ?");
st.setInt(1, foovalue);
ResultSet rs = st.executeQuery();
while (rs.next()) {
System.out.print("Column 1 returned ");
System.out.println(rs.getString(1));
}
rs.close();
st.close();
缺省時,驅動程序一次從查詢裡獲取所有的結果。這樣可能對于大的數據集來說是不方便的, 因此 JDBC 驅動提供了一個方法從一個數據庫遊標傷抽取少數幾行的 ResultSet 的方法。
在鏈接的客戶端這邊緩衝了一小部分數據行,並且在用盡之後, 則通過重定位遊標檢索下一個數據行塊。
Example 31-2. 設置抓取的大小以開關遊標
把代碼修改成遊標模式簡單到只是設置 Statement 的抓取大小到一個合適的程度。 把抓取大小設置為 0 則是緩衝所有行的模式(缺省行為)。
Statement st = db.createStatement();
// 打開遊標的使用。
st.setFetchSize(50);
ResultSet rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
System.out.print("a row was returned.");
}
rs.close();
// 關閉遊標的使用。
st.setFetchSize(0);
ResultSet rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
System.out.print("many rows were returned.");
}
rs.close();
// 關閉語句
st.close();
在使用Statement或 PreparedStatement接口時必須考慮下面的問題:
你可以將一個Statement或 PreparedStatement實例使用任意次。 你可以在打開一個聯接後馬上創建一個Statement 實例,並且在聯接的生存期裡使用之。 你必須記住每個Statement或 PreparedStatement只能存在一個 ResultSet。
如果你需要在處理一個ResultSet的時候執行一個查詢, 你只需要創建並且使用另外一個Statement。
如果你使用了線程,並且有幾個使用數據庫, 你對每個線程必須使用一個獨立的Statement。 如果考慮使用線程,請參考本文檔稍後的 Section 31.9 章節, 因為這些內容包含一些重要的信息。
在你用完 Statement 或者 PreparedStatement 之後,你應該關閉它。
使用ResultSet接口時必須考慮下面的問題:
在讀取任何數值的時候,你必須調用next()。 如果還有結果則返回真(true),但更重要的是,它為處理準備了數據行。
在 JDBC 規範裡,你對一個字段應該只訪問一次。 遵循這個規則是最安全的,不過目前 PostgreSQL 驅動將允許你對一個字段訪問任意次。
一旦你結束對一個 ResultSet 的處理,你必須對之調用 close()來關閉它。
一旦你使用那個創建ResultSet的 Statement做另一個查詢請求, 當前打開的 ResultSet 實例將自動關閉。