statement
Java 執行資料庫操作的一個重要介面
Statement 是 Java 執行資料庫操作的一個重要介面,用於在已經建立資料庫連接的基礎上,向資料庫發送要執行的SQL語句。Statement對象,用於執行不帶參數的簡單SQL語句。
CallableStatement, PreparedStatement
用於執行靜態 SQL 語句並返回它所生成結果的對象。
在默認情況下,同一時間每個 Statement 對象在只能打開一個 ResultSet 對象。因此,如果讀取一個 ResultSet 對象與讀取另一個交叉,則這兩個對象必須是由不同的 Statement 對象生成的。如果存在某個語句的打開的當前 ResultSet 對象,則 Statement 介面中的所有執行方法都會隱式關閉它。
Statement 對象用於將 SQL 語句發送到資料庫中。實際上有三種 Statement 對象,它們都作為在給定連接上執行 SQL 語句的包容器:Statement、PreparedStatement(它從 Statement 繼承而來)和 CallableStatement(它從 PreparedStatement 繼承而來)。它們都專用於發送特定類型的 SQL 語句: Statement 對象用於執行不帶參數的簡單 SQL 語句;PreparedStatement 對象用於執行帶或不帶 IN 參數的預編譯 SQL 語句;CallableStatement 對象用於執行對資料庫已存在的存儲過程的調用。
Statement 介面提供了執行語句和獲取結果的基本方法。PreparedStatement 介面添加了處理 IN 參數的方法;而 CallableStatement 添加了處理 OUT 參數的方法。
有些 DBMS 將已存儲過程中的每條語句視為獨立的語句;而另外一些則將整個過程視為一個複合語句。在啟用自動提交時,這種差別就變得非常重要,因為它影響什麼時候調用 commit 方法。在前一種情況中,每條語句單獨提交;在後一種情況中,所有語句同時提交。
欄位摘要
static int CLOSE_ALL_RESULTS
該常量指示調用 getMoreResults 時應該關閉以前一直打開的所有 ResultSet 對象。
static int CLOSE_CURRENT_RESULT
該常量指示調用 getMoreResults 時應該關閉當前 ResultSet 對象。
static int EXECUTE_FAILED
該常量指示在執行批量語句時發生錯誤。
static int KEEP_CURRENT_RESULT
該常量指示調用 getMoreResults 時不會關閉當前 ResultSet 對象。
static int NO_GENERATED_KEYS
該常量指示生成的鍵應該不可用於獲取。
static int RETURN_GENERATED_KEYS
該常量指示生成的鍵應該可用於獲取。
static int SUCCESS_NO_INFO
該常量指示批量語句執行成功但不存在受影響的可用行數計數。
方法摘要
void addBatch(String sql)
將給定的 SQL 命令添加到此 Statement 對象的當前命令列表中。
void cancel()
如果 DBMS 和驅動程序都支持中止 SQL 語句,則取消此 Statement 對象。
void clearBatch()
清空此 Statement 對象的當前 SQL 命令列表。
void clearWarnings()
清除在此 Statement 對象上報告的所有警告。
void close()
立即釋放此 Statement 對象的資料庫和 JDBC 資源,而不是等待該對象自動關閉時發生此操作。
boolean execute(String sql)
執行給定的 SQL 語句,該語句在返回一個布爾值時用於反映SQL語句是否執行成功。
boolean execute(String sql, int autoGeneratedKeys)
執行給定的 SQL 語句(該語句返回一個布爾值用於反映SQL語句是否成功執行),並通知驅動程序所有自動生成的鍵都應該可用於獲取。
boolean execute(String sql, int[] columnIndexes)
執行給定的 SQL 語句,(該語句返回一個布爾值用於反映SQL語句是否執行成功),並通知驅動程序在給定數組中指示的自動生成的鍵應可用獲取。
boolean execute(String sql, String[] columnNames)
執行給定的 SQL 語句,該語句返回一個布爾值用於反映SQL語句是否成功執行,並通知驅動程序在給定數組中指示的自動生成的鍵用於獲取。
int[] executeBatch()
將一批命令提交給資料庫來執行,如果全部命令執行成功,則返回更新計數組成的數組。
ResultSet executeQuery(String sql)
執行給定的 SQL 語句,該語句返回單個 ResultSet 對象。
int executeUpdate(String sql)
執行給定 SQL 語句,該語句可能為 INSERT、UPDATE 或 DELETE 語句,或者不返回任何內容的 SQL 語句(如 SQL DDL 語句)。
int executeUpdate(String sql, int autoGeneratedKeys)
執行給定的 SQL 語句,並用給定標誌通知驅動程序由此 Statement 生成的自動生成鍵是否可用於獲取。
int executeUpdate(String sql, int[] columnIndexes)
執行給定的 SQL 語句,並通知驅動程序在給定數組中指示的自動生成的鍵可用於獲取。
int executeUpdate(String sql, String[] columnNames)
執行給定的 SQL 語句,通知驅動程序在給定數組中指示的自動生成的鍵可用於獲取。
Connection getConnection()
獲取生成此 Statement 對象的 Connection 對象。
int getFetchDirection()
獲取從資料庫表獲取行的方向,該方向是根據此 Statement 對象生成的結果集合的默認值。
int getFetchSize()
獲取結果集合的行數,該數是根據此 Statement 對象生成的 ResultSet 對象的默認獲取大小。
ResultSet getGeneratedKeys()
獲取由於執行此 Statement 對象而創建的所有自動生成的鍵。
int getMaxFieldSize()
獲取可以為此 Statement 對象所生成 ResultSet 對象中的字元和二進位列值返回的最大位元組數。
int getMaxRows()
獲取由此 Statement 對象生成的 ResultSet 對象可以包含的最大行數。
boolean getMoreResults()
移動到此 Statement 對象的下一個結果,如果其為 ResultSet 對象,則返回 true,並隱式關閉利用方法 getResultSet 獲取的所有當前 ResultSet 對象。
boolean getMoreResults(int current)
將此 Statement 對象移動到下一個結果,根據給定標誌指定的指令處理所有當前 ResultSet 對象;如果下一個結果為 ResultSet 對象,則返回 true。
int getQueryTimeout()
獲取驅動程序等待 Statement 對象執行的秒數。
ResultSet getResultSet()
以 ResultSet 對象的形式獲取當前結果。
int getResultSetConcurrency()
獲取此 Statement 對象生成的 ResultSet 對象的結果集合併發性。
int getResultSetHoldability()
獲取此 Statement 對象生成的 ResultSet 對象的結果集合可保存性。
int getResultSetType()
獲取此 Statement 對象生成的 ResultSet 對象的結果集合類型。
int getUpdateCount()
以更新計數的形式獲取當前結果;如果結果為 ResultSet 對象或沒有更多結果,則返回 -1。
SQLWarning getWarnings()
獲取此 Statement 對象上的調用報告的第一個警告。
boolean isClosed()
獲取是否已關閉了此 Statement 對象。
boolean isPoolable()
返回指示 Statement 是否是可池化的值。
void setCursorName(String name)
將 SQL指針名稱設置為給定的 String,後續 Statement 對象的 execute 方法將使用此字元串。
void setEscapeProcessing(boolean enable)
將轉義處理設置為開或關。
void setFetchDirection(int direction)
向驅動程序提供關於方向的提示,在使用此 Statement 對象創建的 ResultSet 對象中將按該方向處理行。
void setFetchSize(int rows)
為 JDBC驅動程序提供一個提示,它提示此 Statement 生成的 ResultSet 對象需要更多行時應該從資料庫獲取的行數。
void setMaxFieldSize(int max)
設置此 Statement 對象生成的 ResultSet 對象中字元和二進位列值可以返回的最大位元組數限制。
void setMaxRows(int max)
將此 Statement 對象生成的所有 ResultSet 對象可以包含的最大行數限制設置為給定數。
void setPoolable(boolean poolable)
請求將 Statement 池化或非池化。
void setQueryTimeout(int seconds)
將驅動程序等待 Statement 對象執行的秒數設置為給定秒數。
1、創建 Statement 對象
建立了到特定資料庫的連接之後,就可用該連接發送 SQL 語句。Statement 對象用 Connection 的方法 createStatement 創建,如下列代碼段中所示:
Connection con = DriverManager.getConnection(url, "sunny", "");
Statement stmt = con.createStatement();
為了執行 Statement 對象,被發送到資料庫的 SQL 語句將被作為參數提供給 Statement 的方法:
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2");
2、使用 Statement 對象執行語句
通過工具來創建SQL statement
方法 executeQuery 用於產生單個結果集的語句,例如 SELECT 語句。
方法 executeUpdate 用於執行 INSERT、UPDATE 或 DELETE 語句以及 SQL DDL(數據定義語言)語句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 語句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一個整數,指示受影響的行數(即更新計數)。對於 CREATE TABLE 或 DROP TABLE 等不操作行的語句,executeUpdate 的返回值總為零。
方法 execute 用於執行返回多個結果集、多個更新計數或二者組合的語句。因為多數程序員不會需要該高級功能,所以本概述後面將在單獨一節中對其進行介紹。
執行語句的所有方法都將關閉所調用的 Statement 對象的當前打開結果集(如果存在)。這意味著在重新執行 Statement 對象之前,需要完成對當前 ResultSet 對象的處理。
應注意,繼承了 Statement 介面中所有方法的 PreparedStatement 介面都有自己的 executeQuery、executeUpdate 和 execute 方法。Statement 對象本身不包含 SQL 語句,因而必須給 Statement.execute 方法提供 SQL 語句作為參數。PreparedStatement 對象並不將 SQL 語句作為參數提供給這些方法,因為它們已經包含預編譯SQL 語句。CallableStatement 對象繼承這些方法的 PreparedStatement 形式。對於這些方法的 PreparedStatement 或 CallableStatement 版本,使用查詢參數將拋出 SQLException。
3、語句完成
當連接處於自動提交模式時,其中所執行的語句在完成時將自動提交或還原。語句在已執行且所有結果返回時,即認為已完成。對於返回一個結果集的 executeQuery 方法,在檢索完 ResultSet 對象的所有行時該語句完成。對於方法 executeUpdate,當它執行時語句即完成。但在少數調用方法 execute 的情況中,在檢索所有結果集或它生成的更新計數之後語句才完成。
關閉 Statement 對象
Statement 對象將由 Java 垃圾收集程序自動關閉。而作為一種好的編程風格,應在不需要 Statement 對象時顯式地關閉它們。這將立即釋放 DBMS 資源,有助於避免潛在的內存問題。