概述
Statement 對象用于將 SQL 語句發(fā)送到數(shù)據(jù)庫中。實(shí)際上有三種 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 接口提供了執(zhí)行語句和獲取結(jié)果的基本方法。PreparedStatement 接口添加了處理 IN 參數(shù)的方法;而 CallableStatement 添加了處理 OUT 參數(shù)的方法。
1、創(chuàng)建 Statement 對象
建立了到特定數(shù)據(jù)庫的連接之后,就可用該連接發(fā)送 SQL 語句。Statement 對象用 Connection 的方法 createStatement 創(chuàng)建,如下列代碼段中所示:
Connection con = DriverManager.getConnection(url, "sunny", "");
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、executeUpdate 和 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 TABLE 等不操作行的語句,executeUpdate 的返回值總為零。
方法 execute 用于執(zhí)行返回多個結(jié)果集、多個更新計數(shù)或二者組合的語句。因?yàn)槎鄶?shù)程序員不會需要該高級功能,所以本概述后面將在單獨(dú)一節(jié)中對其進(jìn)行介紹。
執(zhí)行語句的所有方法都將關(guān)閉所調(diào)用的 Statement 對象的當(dāng)前打開結(jié)果集(如果存在)。這意味著在重新執(zhí)行 Statement 對象之前,需要完成對當(dāng)前 ResultSet 對象的處理。
應(yīng)注意,繼承了 Statement 接口中所有方法的 PreparedStatement 接口都有自己的 executeQuery、executeUpdate 和 execute 方法。Statement 對象本身不包含 SQL 語句,因而必須給 Statement.execute 方法提供 SQL 語句作為參數(shù)。PreparedStatement 對象并不將 SQL 語句作為參數(shù)提供給這些方法,因?yàn)樗鼈円呀?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ù)之后語句才完成。
有些 DBMS 將已存儲過程中的每條語句視為獨(dú)立的語句;而另外一些則將整個過程視為一個復(fù)合語句。在啟用自動提交時,這種差別就變得非常重要,因?yàn)樗绊懯裁磿r候調(diào)用 commit 方法。在前一種情況中,每條語句單獨(dú)提交;在后一種情況中,所有語句同時提交。
4、關(guān)閉 Statement 對象
Statement 對象將由 Java 垃圾收集程序自動關(guān)閉。而作為一種好的編程風(fēng)格,應(yīng)在不需要 Statement 對象時顯式地關(guān)閉它們。這將立即釋放 DBMS 資源,有助于避免潛在的內(nèi)存問題。
5、Statement 對象中的 SQL 轉(zhuǎn)義語法
Statement 可包含使用 SQL 轉(zhuǎn)義語法的 SQL 語句。轉(zhuǎn)義語法告訴驅(qū)動程序其中的代碼應(yīng)該以不同方式處理。驅(qū)動程序?qū)呙枞魏无D(zhuǎn)義語法,并將它轉(zhuǎn)換成特定數(shù)據(jù)庫可理解的代碼。這使得轉(zhuǎn)義語法與 DBMS 無關(guān),并允許程序員使用在沒有轉(zhuǎn)義語法時不可用的功能。
轉(zhuǎn)義子句由花括號和關(guān)鍵字界定:
{keyword . . . parameters . . . }
該關(guān)鍵字指示轉(zhuǎn)義子句的類型,如下所示。
escape 表示 LIKE 轉(zhuǎn)義字符
字符“%”和“_”類似于 SQL LIKE 子句中的通配符(“%”匹配零個或多個字符,而“_”則匹配一個字符)。為了正確解釋它們,應(yīng)在其前面加上反斜杠(“\”),它是字符串中的特殊轉(zhuǎn)義字符。在查詢末尾包括如下語法即可指定用作轉(zhuǎn)義字符的字符:
{escape 'escape-character'}
例如,下列查詢使用反斜杠字符作為轉(zhuǎn)義字符,查找以下劃線開頭的標(biāo)識符名:
stmt.executeQuery("SELECT name FROM Identifiers
WHERE Id LIKE `\_%' {escape `\'};
fn 表示標(biāo)量函數(shù)
幾乎所有 DBMS 都具有標(biāo)量值的數(shù)值、字符串、時間、日期、系統(tǒng)和轉(zhuǎn)換函數(shù)。要使用這些函數(shù),可使用如下轉(zhuǎn)義語法:關(guān)鍵字 fn 后跟所需的函數(shù)名及其參數(shù)。例如,下列代碼調(diào)用函數(shù) concat 將兩個參數(shù)連接在一起:
{fn concat("Hot", "Java")};
可用下列語法獲得當(dāng)前數(shù)據(jù)庫用戶名:
{fn user()};
標(biāo)量函數(shù)可能由語法稍有不同的 DBMS 支持,而它們可能不被所有驅(qū)動程序支持。各種 DatabaseMetaData 方法將列出所支持的函數(shù)。例如,方法 getNumericFunctions 返回用逗號分隔的數(shù)值函數(shù)列表,而方法 getStringFunctions 將返回字符串函數(shù),等等。
驅(qū)動程序?qū)⑥D(zhuǎn)義函數(shù)調(diào)用映射為相應(yīng)的語法,或直接實(shí)現(xiàn)該函數(shù)。
d、t 和 ts 表示日期和時間文字
DBMS 用于日期、時間和時間標(biāo)記文字的語法各不相同。JDBC 使用轉(zhuǎn)義子句支持這些文字的語法的 ISO 標(biāo)準(zhǔn)格式。驅(qū)動程序必須將轉(zhuǎn)義子句轉(zhuǎn)換成 DBMS 表示。
Statement 對象用于將 SQL 語句發(fā)送到數(shù)據(jù)庫中。實(shí)際上有三種 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 接口提供了執(zhí)行語句和獲取結(jié)果的基本方法。PreparedStatement 接口添加了處理 IN 參數(shù)的方法;而 CallableStatement 添加了處理 OUT 參數(shù)的方法。
1、創(chuàng)建 Statement 對象
建立了到特定數(shù)據(jù)庫的連接之后,就可用該連接發(fā)送 SQL 語句。Statement 對象用 Connection 的方法 createStatement 創(chuàng)建,如下列代碼段中所示:
Connection con = DriverManager.getConnection(url, "sunny", "");
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、executeUpdate 和 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 TABLE 等不操作行的語句,executeUpdate 的返回值總為零。
方法 execute 用于執(zhí)行返回多個結(jié)果集、多個更新計數(shù)或二者組合的語句。因?yàn)槎鄶?shù)程序員不會需要該高級功能,所以本概述后面將在單獨(dú)一節(jié)中對其進(jìn)行介紹。
執(zhí)行語句的所有方法都將關(guān)閉所調(diào)用的 Statement 對象的當(dāng)前打開結(jié)果集(如果存在)。這意味著在重新執(zhí)行 Statement 對象之前,需要完成對當(dāng)前 ResultSet 對象的處理。
應(yīng)注意,繼承了 Statement 接口中所有方法的 PreparedStatement 接口都有自己的 executeQuery、executeUpdate 和 execute 方法。Statement 對象本身不包含 SQL 語句,因而必須給 Statement.execute 方法提供 SQL 語句作為參數(shù)。PreparedStatement 對象并不將 SQL 語句作為參數(shù)提供給這些方法,因?yàn)樗鼈円呀?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ù)之后語句才完成。
有些 DBMS 將已存儲過程中的每條語句視為獨(dú)立的語句;而另外一些則將整個過程視為一個復(fù)合語句。在啟用自動提交時,這種差別就變得非常重要,因?yàn)樗绊懯裁磿r候調(diào)用 commit 方法。在前一種情況中,每條語句單獨(dú)提交;在后一種情況中,所有語句同時提交。
4、關(guān)閉 Statement 對象
Statement 對象將由 Java 垃圾收集程序自動關(guān)閉。而作為一種好的編程風(fēng)格,應(yīng)在不需要 Statement 對象時顯式地關(guān)閉它們。這將立即釋放 DBMS 資源,有助于避免潛在的內(nèi)存問題。
5、Statement 對象中的 SQL 轉(zhuǎn)義語法
Statement 可包含使用 SQL 轉(zhuǎn)義語法的 SQL 語句。轉(zhuǎn)義語法告訴驅(qū)動程序其中的代碼應(yīng)該以不同方式處理。驅(qū)動程序?qū)呙枞魏无D(zhuǎn)義語法,并將它轉(zhuǎn)換成特定數(shù)據(jù)庫可理解的代碼。這使得轉(zhuǎn)義語法與 DBMS 無關(guān),并允許程序員使用在沒有轉(zhuǎn)義語法時不可用的功能。
轉(zhuǎn)義子句由花括號和關(guān)鍵字界定:
{keyword . . . parameters . . . }
該關(guān)鍵字指示轉(zhuǎn)義子句的類型,如下所示。
escape 表示 LIKE 轉(zhuǎn)義字符
字符“%”和“_”類似于 SQL LIKE 子句中的通配符(“%”匹配零個或多個字符,而“_”則匹配一個字符)。為了正確解釋它們,應(yīng)在其前面加上反斜杠(“\”),它是字符串中的特殊轉(zhuǎn)義字符。在查詢末尾包括如下語法即可指定用作轉(zhuǎn)義字符的字符:
{escape 'escape-character'}
例如,下列查詢使用反斜杠字符作為轉(zhuǎn)義字符,查找以下劃線開頭的標(biāo)識符名:
stmt.executeQuery("SELECT name FROM Identifiers
WHERE Id LIKE `\_%' {escape `\'};
fn 表示標(biāo)量函數(shù)
幾乎所有 DBMS 都具有標(biāo)量值的數(shù)值、字符串、時間、日期、系統(tǒng)和轉(zhuǎn)換函數(shù)。要使用這些函數(shù),可使用如下轉(zhuǎn)義語法:關(guān)鍵字 fn 后跟所需的函數(shù)名及其參數(shù)。例如,下列代碼調(diào)用函數(shù) concat 將兩個參數(shù)連接在一起:
{fn concat("Hot", "Java")};
可用下列語法獲得當(dāng)前數(shù)據(jù)庫用戶名:
{fn user()};
標(biāo)量函數(shù)可能由語法稍有不同的 DBMS 支持,而它們可能不被所有驅(qū)動程序支持。各種 DatabaseMetaData 方法將列出所支持的函數(shù)。例如,方法 getNumericFunctions 返回用逗號分隔的數(shù)值函數(shù)列表,而方法 getStringFunctions 將返回字符串函數(shù),等等。
驅(qū)動程序?qū)⑥D(zhuǎn)義函數(shù)調(diào)用映射為相應(yīng)的語法,或直接實(shí)現(xiàn)該函數(shù)。
d、t 和 ts 表示日期和時間文字
DBMS 用于日期、時間和時間標(biāo)記文字的語法各不相同。JDBC 使用轉(zhuǎn)義子句支持這些文字的語法的 ISO 標(biāo)準(zhǔn)格式。驅(qū)動程序必須將轉(zhuǎn)義子句轉(zhuǎn)換成 DBMS 表示。