<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我思故我強

    execute、executeQuery和executeUpdate之間的區別(轉)

    在用純JSP做一個頁面報警功能的時候習慣性的用executeQuery來執行SQL語句,結果執行update時就遇到問題,語句能執行,但返回結果出現問題,另外還忽略了executeUpdate的返回值不是結果集ResultSet,而是數值!特收藏如下一篇文章(感謝網友們對各種信息的貢獻):
      
      JDBCTM中Statement接口提供的execute、executeQuery和executeUpdate之間的區別
      
      
       Statement 接口提供了三種執行 SQL 語句的方法:executeQuery、executeUpdate 和 execute。使用哪一個方法由 SQL 語句所產生的內容決定。
      
       方法executeQuery
       用于產生單個結果集的語句,例如 SELECT 語句。 被使用最多的執行 SQL 語句的方法是 executeQuery。這個方法被用來執行 SELECT 語句,它幾乎是使用最多的 SQL 語句。
      
       方法executeUpdate
       用于執行 INSERT、UPDATE 或 DELETE 語句以及 SQL DDL(數據定義語言)語句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 語句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一個整數,指示受影響的行數(即更新計數)。對于 CREATE TABLE 或 DROP TABLE 等不操作行的語句,executeUpdate 的返回值總為零。
      
       使用executeUpdate方法是因為在 createTableCoffees 中的 SQL 語句是 DDL (數據定義語言)語句。創建表,改變表,刪除表都是 DDL 語句的例子,要用 executeUpdate 方法來執行。你也可以從它的名字里看出,方法 executeUpdate 也被用于執行更新表 SQL 語句。實際上,相對于創建表來說,executeUpdate 用于更新表的時間更多,因為表只需要創建一次,但經常被更新。
      
      
       方法execute:
       用于執行返回多個結果集、多個更新計數或二者組合的語句。因為多數程序員不會需要該高級功能
      
       execute方法應該僅在語句能返回多個ResultSet對象、多個更新計數或ResultSet對象與更新計數的組合時使用。當執行某個已存儲過程 或動態執行未知 SQL 字符串(即應用程序程序員在編譯時未知)時,有可能出現多個結果的情況,盡管這種情況很少見。
       因為方法 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 2008-07-17 11:31 李云澤 閱讀(880) 評論(0)  編輯  收藏 所屬分類: J2EE

    主站蜘蛛池模板: 国产福利视精品永久免费| 国产伦精品一区二区三区免费迷 | WWW国产亚洲精品久久麻豆| 免费人成黄页在线观看日本| 亚洲另类激情综合偷自拍图| 久久美女网站免费| 久久精品国产亚洲香蕉| 日本免费电影一区二区| 精品亚洲麻豆1区2区3区| 999久久久免费精品国产| 亚洲乱码日产精品BD在线观看| 免费精品国产自产拍在线观看图片| 亚洲国产日韩在线成人蜜芽| 99视频全部免费精品全部四虎| 亚洲不卡影院午夜在线观看| 色www永久免费视频| 免费又黄又爽又猛大片午夜| 亚洲欧洲日产国码无码网站| 免费看又黄又无码的网站| 国产成人精品日本亚洲网址| 国产乱人免费视频| a级毛片毛片免费观看永久| 久久久久久亚洲Av无码精品专口| 国产又黄又爽又猛免费app| 国产精品观看在线亚洲人成网| 亚洲人成色77777在线观看大| 日本高清高色视频免费| 一区二区亚洲精品精华液| 亚洲伦乱亚洲h视频| 99精品国产成人a∨免费看| 亚洲乱人伦中文字幕无码| 综合亚洲伊人午夜网| av无码免费一区二区三区| 特级毛片A级毛片100免费播放| 亚洲精品一品区二品区三品区| 国产乱码免费卡1卡二卡3卡| 免费一级做a爰片久久毛片潮| 亚洲精品网站在线观看你懂的| 国产伦精品一区二区三区免费迷| 99热这里只有精品免费播放| 色偷偷噜噜噜亚洲男人|