sharky的點滴積累

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            56 隨筆 :: 104 文章 :: 10 評論 :: 0 Trackbacks
          Statement 接口提供了三種執行 SQL 語句的方法:executeQuery、executeUpdate 和 execute。使用哪一個方法由 SQL 語句所產生的內容決定。
          
          方法 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。
          
          
          4.1.3 語句完成
          
          當連接處于自動提交模式時,其中所執行的語句在完成時將自動提交或還原。語句在已執行且所有結果返回時,即認為已完成。對于返回一個結果集的 executeQuery 方法,在檢索完 ResultSet 對象的所有行時該語句完成。對于方法executeUpdate,當它執行時語句即完成。但在少數調用方法 execute 的情況中,在檢索所有結果集或它生成的更新計數之后語句才完成。
          
          有些 DBMS 將已存儲過程中的每條語句視為獨立的語句;而另外一些則將整個過程視為一個復合語句。在啟用自動提交時,這種差別就變得非常重要,因為它影響什么時候調用 commit 方法。在前一種情況中,每條語句單獨提交;在后一種情況中,所有語句同時提交。
          
          
          4.1.4 關閉 Statement 對象
          
          Statement 對象將由 Java 垃圾收集程序自動關閉。而作為一種好的編程風格,應在不需要 Statement 對象時顯式地關閉它們。這將立即釋放 DBMS 資源,有助于避免潛在的內存問題。
          
          
          4.1.5 Statement 對象中的 SQL 轉義語法
          
          Statement 可包含使用 SQL 轉義語法的 SQL 語句。轉義語法告訴驅動程序其中的代碼應該以不同方式處理。驅動程序將掃描任何轉義語法,并將它轉換成特定數據庫可理解的代碼。這使得轉義語法與 DBMS 無關,并允許程序員使用在沒有轉義語法時不可用的功能。
          
          
          轉義子句由花括號和關鍵字界定:
          
          {keyword . . . parameters . . . }
          
          該關鍵字指示轉義子句的類型,如下所示。
          
          
          escape 表示 LIKE 轉義字符
          
          字符“%”和“_”類似于 SQL LIKE 子句中的通配符(“%”匹配零個或多個字符,而“_”則匹配一個字符)。為了正確解釋它們,應在其前面加上反斜杠(“”),它是字符串中的特殊轉義字符。在查詢末尾包括如下語法即可指定用作轉義字符的字符:
          
          {escape 'escape-character'}
          
          
          例如,下列查詢使用反斜杠字符作為轉義字符,查找以下劃線開頭的標識符名:
          
          stmt.executeQuery("SELECT name FROM Identifiers WHERE Id LIKE `\_%' {escape `'};
          
          fn 表示標量函數
          
          
          幾乎所有 DBMS 都具有標量值的數值、字符串、時間、日期、系統和轉換函數。要使用這些函數,可使用如下轉義語法:關鍵字 fn 后跟所需的函數名及其參數。例如,下列代碼調用函數 concat 將兩個參數連接在一起:
          
          {fn concat("Hot", "Java")};
          
          可用下列語法獲得當前數據庫用戶名:
          
          {fn user()};
          
          
          標量函數可能由語法稍有不同的 DBMS 支持,而它們可能不被所有驅動程序支持。各種 DatabaseMetaData 方法將列出所支持的函數。例如,方法getNumericFunctions 返回用逗號分隔的數值函數列表,而方法getStringFunctions 將返回字符串函數,等等。
          
          驅動程序將轉義函數調用映射為相應的語法,或直接實現該函數。
          
          
          d、t 和 ts 表示日期和時間文字
          
          DBMS 用于日期、時間和時間標記文字的語法各不相同。JDBC 使用轉義子句支持這些文字的語法的 ISO 標準格式。驅動程序必須將轉義子句轉換成 DBMS 表示。
          
          例如,可用下列語法在 JDBC SQL 語句中指定日期:
          
          {d `yyyy-mm-dd'}
          
          
          在該語法中,yyyy 為年代,mm 為月份,而 dd 則為日期。驅動程序將用等價的特定于 DBMS 的表示替換這個轉義子句。例如,如果 '28- FEB-99' 符合基本數據庫的格式,則驅動程序將用它替換 {d 1999-02-28}。
          
          對于 TIME 和 TIMESTAMP 也有類似的轉義子句:
          
          {t `hh:mm:ss'}
          {ts `yyyy-mm-dd hh:mm:ss.f . . .'}
          
          TIMESTAMP 中的小數點后的秒(.f . . .)部分可忽略。
          
          
          call 或 ? = call 表示已存儲過程
          
          
          
          如果數據庫支持已存儲過程,則可從 JDBC 中調用它們,語法為:
          
          {call procedure_name[(?, ?, . . .)]}
          
          
          或(其中過程返回結果參數):
          
          {? = call procedure_name[(?, ?, . . .)]}
          
          
          方括號指示其中的內容是可選的。它們不是語法的必要部分。
          
          輸入參數可以為文字或參數。有關詳細信息,參見 JDBC 指南中第 7 節,“CallableStatement”。
          
          
          可通過調用方法 DatabaseMetaData.supportsStoredProcedures 檢查數據庫是否支持已存儲過程。
          
          
          
          oj 表示外部連接
          
          
          
          外部連接的語法為
          
          {oj outer-join}
          
          
          其中 outer-join 形式為
          
          table LEFT OUTER JOIN {table / outer-join} ON search-condition
          
          
          外部連接屬于高級功能。有關它們的解釋可參見 SQL 語法。JDBC 提供了三種DatabaseMetaData 方法用于確定驅動程序支持哪些外部連接類型:supportsOuterJoins、supportsFullOuterJoins 和supportsLimitedOuterJoins
          。
          
          
          方法 Statement.setEscapeProcessing 可打開或關閉轉義處理;缺省狀態為打開。當性能極為重要時,程序員可能想關閉它以減少處理時間。但通常它將出于打開狀態。應注意: setEscapeProcessing 不適用于 PreparedStatement 對象,因為在調用該語句前它就可能已被發送到數據庫。有關預編譯的信息,參見PreparedStatement。
          
          
          4.1.6 使用方法 execute
          
          execute 方法應該僅在語句能返回多個 ResultSet 對象、多個更新計數或ResultSet 對象與更新計數的組合時使用。當執行某個已存儲過程或動態執行未知 SQL 字符串(即應用程序程序員在編譯時未知)時,有可能出現多個結果的情況,盡管這種情況很少見。例如,用戶可能執行一個已存儲過程(使用 CallableStatement 對象 - 參見第 135 頁的 CallableStatement),并且該已存儲過程可執行更新,然后執行選擇,再進行更新,再進行選擇,等等。通常使用已存儲過程的人應知道它所返回的內容。
          
          因為方法 execute 處理非常規情況,所以獲取其結果需要一些特殊處理并不足為怪。例如,假定已知某個過程返回兩個結果集,則在使用方法 execute 執行該過程后,必須調用方法 getResultSet 獲得第一個結果集,然后調用適當的getXXX 方法獲取其中的值。要獲得第二個結果集,需要先調用 getMoreResults方法,然后再調用 getResultSet 方法。如果已知某個過程返回兩個更新計數,則首先調用方法 getUpdateCount,然后調用 getMoreResults,并再次調用getUpdateCount。
          
          對于不知道返回內容,則情況更為復雜。如果結果是 ResultSet 對象,則方法execute 返回 true;如果結果是 Java int,則返回 false。如果返回 int,則意味著結果是更新計數或執行的語句是 DDL 命令。在調用方法 execute 之后要做的第一件事情是調用 getResultSet 或 getUpdateCount。調用方法 getResultSet可以獲得兩個或多個 ResultSet 對象中第一個對象;或調用方法 getUpdateCount 可以獲得兩個或多個更新計數中第一個更新計數的內容。
          
          當 SQL 語句的結果不是結果集時,則方法 getResultSet 將返回 null。這可能意味著結果是一個更新計數或沒有其它結果。在這種情況下,判斷 null 真正含義的唯一方法是調用方法 getUpdateCount,它將返回一個整數。這個整數為調用語句所影響的行數;如果為 -1 則表示結果是結果集或沒有結果。如果方法getResultSet 已返回 null(表示結果不是 ResultSet 對象),則返回值 -1 表示沒有其它結果。也就是說,當下列條件為真時表示沒有結果(或沒有其它結果):
          
          ((stmt.getResultSet() == null) && (stmt.getUpdateCount() == -1))
          如果已經調用方法 getResultSet 并處理了它返回的 Resul
          posted on 2005-10-12 20:24 sharky的點滴積累 閱讀(1033) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 子洲县| 萨迦县| 福安市| 江山市| 隆昌县| 全南县| 洛南县| 兴化市| 富民县| 鄂托克前旗| 乳山市| 凉山| 淳安县| 福鼎市| 新野县| 汝南县| 贺州市| 丰镇市| 台北县| 搜索| 玛曲县| 施甸县| 夏津县| 连山| 吴旗县| 龙州县| 三明市| 定州市| 武山县| 博罗县| 林甸县| 炉霍县| 福鼎市| 文昌市| 西城区| 襄垣县| 成武县| 新乡市| 祁连县| 乾安县| 枣强县|