《[java編程]Statement詳解》由會員分享,可在線閱讀,更多相關(guān)《[java編程]Statement詳解(6頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、接口定義
---Wrapper
所有已知子接口
CallableStatement, PreparedStatement
說明
用于執(zhí)行靜態(tài) SQL 語句并返回它所生成結(jié)果的對象。
在默認(rèn)情況下,同一時間每個?Statement?對象在只能打開一個 ResultSet 對象。因此,如果讀取一個 ResultSet 對象與讀取另一個交叉,則這兩個對象必須是由不同的?Statement?對象生成的。如果存在某個語句的打開的當(dāng)前 ResultSet 對象,則?Statement?接口中的所有執(zhí)行方法都會隱式關(guān)閉它。
Statement?對象用于將 SQL
2、 語句發(fā)送到數(shù)據(jù)庫中。實際上有三種?Statement?對象,它們都作為在給定連接上執(zhí)行 SQL 語句的包容器:Statement、PreparedStatement(它從?Statement?繼承而來)和 CallableStatement(它從 PreparedStatement 繼承而來)。它們都專用于發(fā)送特定類型的 SQL 語句:Statement?對象用于執(zhí)行不帶參數(shù)的簡單 SQL 語句;PreparedStatement 對象用于執(zhí)行帶或不帶 IN 參數(shù)的預(yù)編譯 SQL 語句;CallableStatement 對象用于執(zhí)行對數(shù)據(jù)庫已存儲過程的調(diào)用。
Statement?接口
3、提供了執(zhí)行語句和獲取結(jié)果的基本方法。PreparedStatement 接口添加了處理 IN 參數(shù)的方法;而 CallableStatement 添加了處理 OUT 參數(shù)的方法。
有些 DBMS 將已存儲過程中的每條語句視為獨立的語句;而另外一些則將整個過程視為一個復(fù)合語句。在啟用自動提交時,這種差別就變得非常重要,因為它影響什么時候調(diào)用 commit 方法。在前一種情況中,每條語句單獨提交;在后一種情況中,所有語句同時提交。
字段摘要
static int? ?? ?? ?CLOSE_ALL_RESULTS
該常量指示調(diào)用 getMoreResults 時應(yīng)該關(guān)閉以前
4、一直打開的所有 ResultSet 對象。
static int? ?? ?? ?CLOSE_CURRENT_RESULT
該常量指示調(diào)用 getMoreResults 時應(yīng)該關(guān)閉當(dāng)前 ResultSet 對象。
static int? ?? ?? ?EXECUTE_FAILED
該常量指示在執(zhí)行批量語句時發(fā)生錯誤。
static int? ?? ?? ?KEEP_CURRENT_RESULT
該常量指示調(diào)用 getMoreResults 時應(yīng)該關(guān)閉當(dāng)前 ResultSet 對象。
static int? ?? ?? ?NO_GENERATED_KEY
5、S
該常量指示生成的鍵應(yīng)該不可用于獲取。
static int? ?? ?? ?RETURN_GENERATED_KEYS
該常量指示生成的鍵應(yīng)該可用于獲取。
static int? ?? ?? ?SUCCESS_NO_INFO
該常量指示批量語句執(zhí)行成功但不存在受影響的可用行數(shù)計數(shù)。
方法摘要
void? ?? ?? ?addBatch(String sql)
將給定的 SQL 命令添加到此?Statement?對象的當(dāng)前命令列表中。
void? ?? ?? ?cancel()
如果 DBMS 和驅(qū)動程序都支持中止 SQL 語句,則
6、取消此?Statement?對象。
void? ?? ?? ?clearBatch()
清空此?Statement?對象的當(dāng)前 SQL 命令列表。
void? ?? ?? ?clearWarnings()
清除在此?Statement?對象上報告的所有警告。
void? ?? ?? ?close()
立即釋放此?Statement?對象的數(shù)據(jù)庫和 JDBC 資源,而不是等待該對象自動關(guān)閉時發(fā)生此操作。
boolean? ?? ?? ?execute(String sql)
執(zhí)行給定的 SQL 語句,該語句可能返回多個結(jié)果。
boolean?
7、 ?? ?? ?execute(String sql, int autoGeneratedKeys)
執(zhí)行給定的 SQL 語句(該語句可能返回多個結(jié)果),并通知驅(qū)動程序所有自動生成的鍵都應(yīng)該可用于獲取。
boolean? ?? ?? ?execute(String sql, int[] columnIndexes)
執(zhí)行給定的 SQL 語句(該語句可能返回多個結(jié)果),并通知驅(qū)動程序在給定數(shù)組中指示的自動生成的鍵應(yīng)該可用于獲取。
boolean? ?? ?? ?execute(String sql, String[] columnNames)
執(zhí)行給定的 SQL 語
8、句(該語句可能返回多個結(jié)果),并通知驅(qū)動程序在給定數(shù)組中指示的自動生成的鍵應(yīng)該可用于獲取。
int[]? ?? ?? ?executeBatch()
將一批命令提交給數(shù)據(jù)庫來執(zhí)行,如果全部命令執(zhí)行成功,則返回更新計數(shù)組成的數(shù)組。
ResultSet? ?? ?? ?executeQuery(String sql)
執(zhí)行給定的 SQL 語句,該語句返回單個 ResultSet 對象。
int? ?? ?? ?executeUpdate(String sql)
執(zhí)行給定 SQL 語句,該語句可能為 INSERT、UPDATE 或 DELETE 語句,或者不返回任
9、何內(nèi)容的 SQL 語句(如 SQL DDL 語句)。
int? ?? ?? ?executeUpdate(String sql, int autoGeneratedKeys)
執(zhí)行給定的 SQL 語句,并用給定標(biāo)志通知驅(qū)動程序由此?Statement?生成的自動生成鍵是否可用于獲取。
int? ?? ?? ?executeUpdate(String sql, int[] columnIndexes)
執(zhí)行給定的 SQL 語句,并通知驅(qū)動程序在給定數(shù)組中指示的自動生成的鍵應(yīng)該可用于獲取。
int? ?? ?? ?executeUpdate(String sql, S
10、tring[] columnNames)
執(zhí)行給定的 SQL 語句,并通知驅(qū)動程序在給定數(shù)組中指示的自動生成的鍵應(yīng)該可用于獲取。
Connection? ?? ?? ?getConnection()
獲取生成此 Statement 對象的 Connection 對象。
int? ?? ?? ?getFetchDirection()
獲取從數(shù)據(jù)庫表獲取行的方向,該方向是根據(jù)此 Statement 對象生成的結(jié)果集合的默認(rèn)值。
int? ?? ?? ?getFetchSize()
獲取結(jié)果集合的行數(shù),該數(shù)是根據(jù)此 Statement 對象生成的 R
11、esultSet 對象的默認(rèn)獲取大小。
ResultSet? ?? ?? ?getGeneratedKeys()
獲取由于執(zhí)行此 Statement 對象而創(chuàng)建的所有自動生成的鍵。
int? ?? ?? ?getMaxFieldSize()
獲取可以為此 Statement 對象所生成 ResultSet 對象中的字符和二進制列值返回的最大字節(jié)數(shù)。
int? ?? ?? ?getMaxRows()
獲取由此 Statement 對象生成的 ResultSet 對象可以包含的最大行數(shù)。
boolean? ?? ?? ?getMoreResults()
12、 移動到此 Statement 對象的下一個結(jié)果,如果其為 ResultSet 對象,則返回 true,并隱式關(guān)閉利用方法 getResultSet 獲取的所有當(dāng)前 ResultSet 對象。
boolean? ?? ?? ?getMoreResults(int current)
將此 Statement 對象移動到下一個結(jié)果,根據(jù)給定標(biāo)志指定的指令處理所有當(dāng)前 ResultSet 對象;如果下一個結(jié)果為 ResultSet 對象,則返回 true。
int? ?? ?? ?getQueryTimeout()
獲取驅(qū)動程序等待 Statement 對象執(zhí)行的秒數(shù)。
13、 ResultSet? ?? ?? ?getResultSet()
以 ResultSet 對象的形式獲取當(dāng)前結(jié)果。
int? ?? ?? ?getResultSetConcurrency()
獲取此 Statement 對象生成的 ResultSet 對象的結(jié)果集合并發(fā)性。
int? ?? ?? ?getResultSetHoldability()
獲取此 Statement 對象生成的 ResultSet 對象的結(jié)果集合可保存性。
int? ?? ?? ?getResultSetType()
獲取此 Statement 對象生成的 ResultS
14、et 對象的結(jié)果集合類型。
int? ?? ?? ?getUpdateCount()
以更新計數(shù)的形式獲取當(dāng)前結(jié)果;如果結(jié)果為 ResultSet 對象或沒有更多結(jié)果,則返回 -1。
SQLWarning? ?? ?? ?getWarnings()
獲取此 Statement 對象上的調(diào)用報告的第一個警告。
boolean? ?? ?? ?isClosed()
獲取是否已關(guān)閉了此 Statement 對象。
boolean? ?? ?? ?isPoolable()
返回指示 Statement 是否是可池化的值。
void? ??
15、?? ?setCursorName(String name)
將 SQL 指針名稱設(shè)置為給定的 String,后續(xù) Statement 對象的 execute 方法將使用此字符串。
void? ?? ?? ?setEscapeProcessing(boolean enable)
將轉(zhuǎn)義處理設(shè)置為開或關(guān)。
void? ?? ?? ?setFetchDirection(int direction)
向驅(qū)動程序提供關(guān)于方向的提示,在使用此 Statement 對象創(chuàng)建的 ResultSet 對象中將按該方向處理行。
void? ?? ?? ?setFetc
16、hSize(int rows)
為 JDBC 驅(qū)動程序提供一個提示,它提示此 Statement 生成的 ResultSet 對象需要更多行時應(yīng)該從數(shù)據(jù)庫獲取的行數(shù)。
void? ?? ?? ?setMaxFieldSize(int max)
設(shè)置此 Statement 對象生成的 ResultSet 對象中字符和二進制列值可以返回的最大字節(jié)數(shù)限制。
void? ?? ?? ?setMaxRows(int max)
將此 Statement 對象生成的所有 ResultSet 對象可以包含的最大行數(shù)限制設(shè)置為給定數(shù)。
void? ?? ?? ?setPool
17、able(boolean poolable)
請求將 Statement 池化或非池化。
void? ?? ?? ?setQueryTimeout(int seconds)
將驅(qū)動程序等待 Statement 對象執(zhí)行的秒數(shù)設(shè)置為給定秒數(shù)。
Statement 使用案例
1、創(chuàng)建 Statement 對象
建立了到特定數(shù)據(jù)庫的連接之后,就可用該連接發(fā)送 SQL 語句。Statement 對象用 Connection 的方法 createStatement 創(chuàng)建,如下列代碼段中所示:
Connection con = DriverManager
18、.getConnection(url, \"wyjava\", \"wyjava\");
Statement stmt = con.createStatement();
為了執(zhí)行 Statement 對象,被發(fā)送到數(shù)據(jù)庫的 SQL 語句將被作為參數(shù)提供給 Statement 的方法:
ResultSet rs = stmt.executeQuery(\"SELECT a, b, c FROM Table2\");
2、使用 Statement 對象執(zhí)行語句
Statement 接口提供了三種執(zhí)行 SQL 語句的方法:executeQuery、execu
19、teUpdate 和 execute。使用哪一個方法由 SQL 語句所產(chǎn)生的內(nèi)容決定。
方法 executeQuery 用于產(chǎn)生單個結(jié)果集的語句,例如 SELECT 語句。
方法 executeUpdate 用于執(zhí)行 INSERT、UPDATE 或 DELETE 語句以及 SQL DDL(數(shù)據(jù)定義語言)語句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 語句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一個整數(shù),指示受影響的行數(shù)(即更新計數(shù))。對于 CREATE TABLE 或 DROP
20、 TABLE 等不操作行的語句,executeUpdate 的返回值總為零。
方法 execute 用于執(zhí)行返回多個結(jié)果集、多個更新計數(shù)或二者組合的語句。因為多數(shù)程序員不會需要該高級功能,所以本概述后面將在單獨一節(jié)中對其進行介紹。
執(zhí)行語句的所有方法都將關(guān)閉所調(diào)用的 Statement 對象的當(dāng)前打開結(jié)果集(如果存在)。這意味著在重新執(zhí)行 Statement 對象之前,需要完成對當(dāng)前 ResultSet 對象的處理。
應(yīng)注意,繼承了 Statement 接口中所有方法的 PreparedStatement 接口都有自己的 executeQuery、executeUpdat
21、e 和 execute 方法。Statement 對象本身不包含 SQL 語句,因而必須給 Statement.execute 方法提供 SQL 語句作為參數(shù)。PreparedStatement 對象并不將 SQL 語句作為參數(shù)提供給這些方法,因為它們已經(jīng)包含預(yù)編譯 SQL 語句。CallableStatement 對象繼承這些方法的 PreparedStatement 形式。對于這些方法的 PreparedStatement 或 CallableStatement 版本,使用查詢參數(shù)將拋出 SQLException。
3、語句完成
當(dāng)連接處于自動提交模式時,其中所執(zhí)行的語句在完成時將自動提交或還原。語句在已執(zhí)行且所有結(jié)果返回時,即認(rèn)為已完成。對于返回一個結(jié)果集的 executeQuery 方法,在檢索完 ResultSet 對象的所有行時該語句完成。對于方法 executeUpdate,當(dāng)它執(zhí)行時語句即完成。但在少數(shù)調(diào)用方法 execute 的情況中,在檢索所有結(jié)果集或它生成的更新計數(shù)之后語句才完成。
4、關(guān)閉 Statement 對象
Statement 對象將由 Java 垃圾收集程序自動關(guān)閉。而作為一種好的編程風(fēng)格,應(yīng)在不需要 Statement 對象時顯式地關(guān)閉它們。這將立即釋放 DBMS 資源,有助于避免潛在的內(nèi)存問題。