青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

路漫漫,長修遠,我們不能沒有錢
隨筆 - 173, 文章 - 0, 評論 - 257, 引用 - 0
數據加載中……

java 的Statement 對象

Statement
本概述是從《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference 》這本書中摘引來的。JavaSoft 目前正在準備這本書。這是一本教程,同時也是 JDBC 的重要參考手冊,它將作為 Java 系列的組成部份在 1997 年春季由 Addison-Wesley 出版公司出版。


4.1 概述
Statement 對象用于將 SQL 語句發送到數據庫中。實際上有三種 Statement 對象,它們都作為在給定連接上執行 SQL 語句的包容器:Statement、PreparedStatement(它從 Statement 繼承而來)和 CallableStatement(它從 PreparedStatement 繼承而來)。它們都專用于發送特定類型的 SQL 語句: Statement 對象用于執行不帶參數的簡單 SQL 語句;PreparedStatement 對象用于執行帶或不帶 IN 參數的預編譯 SQL 語句;CallableStatement 對象用于執行對數據庫已存儲過程的調用。

Statement 接口提供了執行語句和獲取結果的基本方法。PreparedStatement 接口添加了處理 IN 參數的方法;而 CallableStatement 添加了處理 OUT 參數的方法。


4.1.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");

4.1.2 使用 Statement 對象執行語句
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 并處理了它返回的 ResultSet 對象,則有必要調用方法 getMoreResults 以確定是否有其它結果集或更新計數。如果 getMoreResults 返回 true,則需要再次調用 getResultSet 來檢索下一個結果集。如上所述,如果 getResultSet 返回 null,則需要調用 getUpdateCount 來檢查 null 是表示結果為更新計數還是表示沒有其它結果。

當 getMoreResults 返回 false 時,它表示該 SQL 語句返回一個更新計數或沒有其它結果。因此需要調用方法 getUpdateCount 來檢查它是哪一種情況。在這種情況下,當下列條件為真時表示沒有其它結果:

((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))

下面的代碼演示了一種方法用來確認已訪問調用方法 execute 所產生的全部結果集和更新計數:

stmt.execute(queryStringWithUnknownResults); while (true) {
  
int rowCount = stmt.getUpdateCount();
  
if (rowCount > 0) { // 它是更新計數
    System.out.println("Rows changed = " + count);
    stmt.getMoreResults();
    
continue;
  }
  
if (rowCount == 0) { // DDL 命令或 0 個更新
    System.out.println(" No rows changed or statement was DDL
                       command
");
                       stmt.getMoreResults();
                       
continue;

// 執行到這里,證明有一個結果集
//
 或沒有其它結果

  }

  ResultSet rs 
= stmt.getResultSet;
  
if (rs != null) {
    
while (rs.next()) { // 使用元數據獲得關于結果集列的信息
       // 處理結果
          stmt.getMoreResults();
      
continue;
    }
    
break

posted on 2004-10-22 21:41 Khan 閱讀(1817) 評論(0)  編輯 收藏 引用 所屬分類: Java

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区三区毛片| 99精品久久久| 国产一级精品aaaaa看| 麻豆9191精品国产| 中国成人在线视频| 日韩视频在线一区二区| 欧美大片va欧美在线播放| 久久久成人精品| 欧美中文字幕在线| 久久国产乱子精品免费女 | 久久综合狠狠综合久久综合88| 亚洲国产综合视频在线观看| 香蕉久久精品日日躁夜夜躁| 在线亚洲精品福利网址导航| 夜夜嗨av色综合久久久综合网| 亚洲黄色免费网站| 在线亚洲欧美视频| 久久精品人人爽| 亚洲高清不卡在线观看| 亚洲欧洲日韩女同| 亚洲欧美综合v| 欧美激情免费观看| 国产一区二区三区日韩| 亚洲精品乱码久久久久| 亚洲欧美国产制服动漫| 老司机一区二区三区| 国产综合第一页| 久久天天躁狠狠躁夜夜av| 久久婷婷色综合| 欧美日韩一区在线| 亚洲国产精品一区二区久| 亚洲福利国产| 韩国精品主播一区二区在线观看| 黄色综合网站| 欧美在线看片| 亚洲一区日韩在线| 国产精品爱啪在线线免费观看| 狠狠入ady亚洲精品| 欧美中文在线免费| 亚洲精品欧美日韩| 蜜臀a∨国产成人精品| 国产精品久久久久免费a∨大胸| 国产视频一区二区在线观看| 亚洲国产成人av好男人在线观看| 翔田千里一区二区| 亚洲一区久久久| 欧美午夜片在线观看| 亚洲一区二区在线观看视频| 亚洲精品免费观看| 亚洲最黄网站| 国产日韩综合| 亚洲国产婷婷综合在线精品| 蜜桃视频一区| 国产精品尤物福利片在线观看| **性色生活片久久毛片| 99香蕉国产精品偷在线观看| 裸体素人女欧美日韩| 久久久久久久精| 欧美一级视频一区二区| 美女图片一区二区| 亚洲福利视频三区| 精品福利电影| 欧美成人免费在线视频| 看欧美日韩国产| 日韩手机在线导航| 精品88久久久久88久久久| 一区二区三区视频在线看| 激情久久久久久久久久久久久久久久| 亚洲日本欧美日韩高观看| 国产亚洲成人一区| 亚洲自拍电影| 欧美aa国产视频| 欧美日韩成人精品| 国产精品永久在线| 日韩午夜av| 亚洲一区三区电影在线观看| 亚洲一区二区成人| 99在线精品免费视频九九视| 国产精品视频一二三| 99精品99| 午夜精品一区二区三区电影天堂| 国产精品专区第二| 欧美在线看片| 老色批av在线精品| 1769国产精品| 亚洲欧美日韩国产综合| 亚洲欧美亚洲| 国产农村妇女精品| 久久精品国产在热久久| 欧美激情中文不卡| 午夜精品福利视频| 亚洲国产精品一区在线观看不卡| 国内伊人久久久久久网站视频 | 欧美精品一区在线发布| 欧美激情亚洲综合一区| 亚洲天堂成人在线视频| 国产主播一区二区三区四区| 美女啪啪无遮挡免费久久网站| 欧美福利视频在线观看| 99精品热视频| 亚洲日本精品国产第一区| 亚洲午夜国产一区99re久久| 国产精品久久91| 久久伊人一区二区| 午夜精品影院| 欧美激情在线有限公司| 亚洲国产欧美日韩精品| 日韩亚洲欧美中文三级| 激情久久婷婷| 国产在线高清精品| 欧美日韩调教| 欧美另类视频在线| 巨乳诱惑日韩免费av| 性欧美大战久久久久久久久| 91久久夜色精品国产网站| 免费人成网站在线观看欧美高清| 久久综合伊人77777蜜臀| 久久爱91午夜羞羞| 欧美一区二区三区日韩视频| 日韩小视频在线观看| 亚洲欧美日韩国产一区| 亚洲国产成人av| 91久久精品日日躁夜夜躁欧美| 在线视频亚洲| 欧美激情中文字幕乱码免费| 久久久久女教师免费一区| 亚洲国产成人精品女人久久久| 亚洲午夜av电影| 欧美日韩成人网| 亚洲人成毛片在线播放| 久久婷婷色综合| 欧美一区二区三区免费视频 | 久久久亚洲精品一区二区三区| 欧美成人在线免费视频| 欧美在线视频观看| 国产日产欧产精品推荐色| 欧美成人激情视频免费观看| 亚洲日本va午夜在线影院| 亚洲三级电影全部在线观看高清| 一本色道久久综合亚洲精品不卡 | 国产精品入口麻豆原神| 欧美日韩精品免费观看视频| 国产欧美亚洲视频| 亚洲精品美女在线观看| 久久久久久久久久久久久久一区| 91久久精品网| 欧美精品v国产精品v日韩精品| 精久久久久久久久久久| 亚洲综合电影一区二区三区| 久久久久久久久久久一区| 亚洲精品久久7777| 久久久久国色av免费看影院| 国产一区91| 亚洲欧美日韩第一区| 久久久久久久久久久久久久一区| 亚洲网站在线| 国产精品久久久999| 中文成人激情娱乐网| 日韩视频在线观看一区二区| 欧美日韩大片一区二区三区| 亚洲宅男天堂在线观看无病毒| 亚洲国产精品尤物yw在线观看 | 一区二区三区精品久久久| 久久深夜福利| 欧美成人久久| 亚洲在线免费视频| 中文在线一区| 国产亚洲亚洲| 免费观看一区| 国产精品高精视频免费| 久久国产日韩| 欧美日韩hd| 久久天堂国产精品| 欧美亚州一区二区三区| 影音先锋日韩资源| 亚洲午夜极品| 欧美激情一二区| 国产女同一区二区| 欧美激情第4页| 亚洲第一精品福利| 欧美视频二区| 欧美激情一区二区三区在线| 欧美日韩国产一区精品一区| 欧美一级理论片| 欧美精品九九| 久久字幕精品一区| 国产精品国产福利国产秒拍| 欧美亚洲一区在线| 欧美日本国产精品| 免费亚洲婷婷| 在线观看欧美成人| 午夜精品电影| 韩国av一区| 美女91精品| 欧美日韩国产一中文字不卡 | 久久婷婷久久一区二区三区| 久久综合999| 亚洲欧美成aⅴ人在线观看| 国产亚洲一本大道中文在线| 欧美另类变人与禽xxxxx|