konhon

          忘掉過(guò)去,展望未來(lái)。找回自我,超越自我。
          逃避不一定躲的過(guò), 面對(duì)不一定最難過(guò), 孤單不一定不快樂(lè), 得到不一定能長(zhǎng)久, 失去不一定不再擁有, 可能因?yàn)槟硞€(gè)理由而傷心難過(guò), 但我卻能找個(gè)理由讓自己快樂(lè).

          Google

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            203 Posts :: 0 Stories :: 61 Comments :: 0 Trackbacks

          常用鏈接

          留言簿(7)

          隨筆分類

          隨筆檔案

          相冊(cè)

          Business

          Download

          English

          Erp/Mrp

          HR

          J2me

          Java

          Linux/Unix

          Mobile Telephone

          Oracle

          Other

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          全面解析JDBC(四)
          作者:未知?? ??文章來(lái)源:www.jspcn.net
          訪問(wèn)次數(shù): 次????加入時(shí)間:2005-01-19
          如何利用JDBC發(fā)送SQL語(yǔ)句?

            Statement對(duì)象用于將SQL語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)中。實(shí)際上有三種Statement對(duì)象,它們都作為在給定連接上執(zhí)行SQL語(yǔ)句的包容器:Statement、PreparedStatement(它從Statement繼承而來(lái))和CallableStatement(它從PreparedStatement繼承而來(lái))。它們都專用于發(fā)送特定類型的SQL語(yǔ)句:Statement對(duì)象用于執(zhí)行不帶參數(shù)的簡(jiǎn)單SQL語(yǔ)句;PreparedStatement對(duì)象用于執(zhí)行帶或不帶IN參數(shù)的預(yù)編譯SQL語(yǔ)句;CallableStatement對(duì)象用于執(zhí)行對(duì)數(shù)據(jù)庫(kù)已存儲(chǔ)過(guò)程的調(diào)用。

            Statement接口提供了執(zhí)行語(yǔ)句和獲取結(jié)果的基本方法;PreparedStatement接口添加了處理IN參數(shù)的方法;而CallableStatement添加了處理OUT參數(shù)的方法。

            1. 創(chuàng)建Statement對(duì)象

            建立了到特定數(shù)據(jù)庫(kù)的連接之后,就可用該連接發(fā)送SQL語(yǔ)句。Statement對(duì)象用Connection的方法createStatement創(chuàng)建,如下列代碼段中所示:

          Connection con = DriverManager.getConnection(url,"sunny","");
          Statement stmt = con.createStatement();


            為了執(zhí)行Statement對(duì)象,被發(fā)送到數(shù)據(jù)庫(kù)的SQL語(yǔ)句將被作為參數(shù)提供給Statement的方法:

            ResultSet rs = stmt.executeQuery("SELECT a,b,c FROM Table2");

            2. 使用Statement對(duì)象執(zhí)行語(yǔ)句

            Statement接口提供了三種執(zhí)行SQL語(yǔ)句的方法:executeQuery、executeUpdate和execute。使用哪一個(gè)方法由SQL語(yǔ)句所產(chǎn)生的內(nèi)容決定。

            方法executeQuery用于產(chǎn)生單個(gè)結(jié)果集的語(yǔ)句,例如SELECT語(yǔ)句。方法executeUpdate用于執(zhí)行INSERT、UPDATE或DELETE語(yǔ)句以及SQL DDL(數(shù)據(jù)定義語(yǔ)言)語(yǔ)句,例如CREATE TABLE和DROP TABLE。INSERT、UPDATE或DELETE語(yǔ)句的效果是修改表中零行或多行中的一列或多列。executeUpdate的返回值是一個(gè)整數(shù),指示受影響的行數(shù)(即更新計(jì)數(shù))。對(duì)于CREATE TABLE或DROP TABLE等不操作行的語(yǔ)句,executeUpdate的返回值總為零。

            執(zhí)行語(yǔ)句的所有方法都將關(guān)閉所調(diào)用的Statement對(duì)象的當(dāng)前打開結(jié)果集(如果存在)。這意味著在重新執(zhí)行Statement對(duì)象之前,需要完成對(duì)當(dāng)前ResultSet對(duì)象的處理。應(yīng)注意,繼承了Statement接口中所有方法的PreparedStatement接口都有自己的executeQuery、executeUpdate和execute方法。Statement對(duì)象本身不包含SQL語(yǔ)句,因而必須給Statement.execute方法提供SQL語(yǔ)句作為參數(shù)。PreparedStatement對(duì)象并不需要SQL語(yǔ)句作為參數(shù)提供給這些方法,因?yàn)樗鼈円呀?jīng)包含預(yù)編譯SQL語(yǔ)句。

            CallableStatement對(duì)象繼承這些方法的PreparedStatement形式。對(duì)于這些方法的PreparedStatement或CallableStatement版本,使用查詢參數(shù)將拋出SQLException。

            3. 語(yǔ)句完成

            當(dāng)連接處于自動(dòng)提交模式時(shí),其中所執(zhí)行的語(yǔ)句在完成時(shí)將自動(dòng)提交或還原。語(yǔ)句在已執(zhí)行且所有結(jié)果返回時(shí),即認(rèn)為已完成。對(duì)于返回一個(gè)結(jié)果集的executeQuery方法,在檢索完ResultSet對(duì)象的所有行時(shí)該語(yǔ)句完成。對(duì)于方法executeUpdate,當(dāng)它執(zhí)行時(shí)語(yǔ)句即完成。但在少數(shù)調(diào)用方法execute的情況中,在檢索所有結(jié)果集或它生成的更新計(jì)數(shù)之后語(yǔ)句才完成。

            有些DBMS將已存儲(chǔ)過(guò)程中的每條語(yǔ)句視為獨(dú)立的語(yǔ)句;而另外一些則將整個(gè)過(guò)程視為一個(gè)復(fù)合語(yǔ)句。在啟用自動(dòng)提交時(shí),這種差別就變得非常重要,因?yàn)樗绊懯裁磿r(shí)候調(diào)用commit方法。在前一種情況中,每條語(yǔ)句單獨(dú)提交;在后一種情況中,所有語(yǔ)句同時(shí)提交。

            4. 關(guān)閉Statement對(duì)象

            Statement對(duì)象將由Java垃圾收集程序自動(dòng)關(guān)閉。而作為一種好的編程風(fēng)格,應(yīng)在不需要Statement對(duì)象時(shí)顯式地關(guān)閉它們。這將立即釋放DBMS資源,有助于避免潛在的內(nèi)存問(wèn)題。

            5. 使用方法execute

            execute方法應(yīng)該僅在語(yǔ)句能返回多個(gè)ResultSet對(duì)象、多個(gè)更新計(jì)數(shù)或ResultSet對(duì)象與更新計(jì)數(shù)的組合時(shí)使用。當(dāng)執(zhí)行某個(gè)已存儲(chǔ)過(guò)程或動(dòng)態(tài)執(zhí)行未知SQL字符串(即應(yīng)用程序程序員在編譯時(shí)未知)時(shí),有可能出現(xiàn)多個(gè)結(jié)果的情況,盡管這種情況很少見(jiàn)。例如,用戶可能執(zhí)行一個(gè)已存儲(chǔ)過(guò)程,并且該已存儲(chǔ)過(guò)程可執(zhí)行更新,然后執(zhí)行選擇,再進(jìn)行更新,再進(jìn)行選擇,等等。通常使用已存儲(chǔ)過(guò)程的人應(yīng)知道它所返回的內(nèi)容。

            因?yàn)榉椒╡xecute處理非常規(guī)情況,所以獲取其結(jié)果需要一些特殊處理并不足為怪。例如,假定已知某個(gè)過(guò)程返回兩個(gè)結(jié)果集,則在使用方法execute執(zhí)行該過(guò)程后,必須調(diào)用方法getResultSet獲得第一個(gè)結(jié)果集,然后調(diào)用適當(dāng)?shù)膅etXXX方法獲取其中的值。要獲得第二個(gè)結(jié)果集,需要先調(diào)用getMoreResults方法,然后再調(diào)用getResultSet方法。如果已知某個(gè)過(guò)程返回兩個(gè)更新計(jì)數(shù),則首先調(diào)用方法getUpdateCount,然后調(diào)用getMoreResults,并再次調(diào)用getUpdateCount。

            對(duì)于不知道返回內(nèi)容,則情況更為復(fù)雜。如果結(jié)果是ResultSet對(duì)象,則方法execute返回true;如果結(jié)果是Javaint,則返回false。如果返回int,則意味著結(jié)果是更新計(jì)數(shù)或執(zhí)行的語(yǔ)句是DL命令。在調(diào)用方法execute之后要做的第一件事情是調(diào)用getResultSet或getUpdateCount。調(diào)用方法getResultSet可以獲得兩個(gè)或多個(gè)ResultSet對(duì)象中第一個(gè)對(duì)象;或調(diào)用方法getUpdateCount可以獲得兩個(gè)或多個(gè)更新計(jì)數(shù)中第一個(gè)更新計(jì)數(shù)的內(nèi)容。

            當(dāng)SQL語(yǔ)句的結(jié)果不是結(jié)果集時(shí),則方法getResultSet將返回null。這可能意味著結(jié)果是一個(gè)更新計(jì)數(shù)或沒(méi)有其它結(jié)果。在這種情況下,判斷null真正含義的唯一方法是調(diào)用方法getUpdateCount,它將返回一個(gè)整數(shù)。這個(gè)整數(shù)為調(diào)用語(yǔ)句所影響的行數(shù);如果為-1則表示結(jié)果是結(jié)果集或沒(méi)有結(jié)果。如果方法getResultSet已返回null(表示結(jié)果不是ResultSet對(duì)象),則返回值-1表示沒(méi)有其它結(jié)果。也就是說(shuō),當(dāng)下列條件為真時(shí)表示沒(méi)有結(jié)果(或沒(méi)有其它結(jié)果):

            ((stmt.getResultSet()==null)&&(stmt.getUpdateCount()==-1))

            如果已經(jīng)調(diào)用方法getResultSet并處理了它返回的ResultSet對(duì)象,則有必要調(diào)用方法getMoreResults以確定是否有其它結(jié)果集或更新計(jì)數(shù)。如果getMoreResults返回true,則需要再次調(diào)用getResultSet來(lái)檢索下一個(gè)結(jié)果集。如上所述,如果getResultSet返回null,則需要調(diào)用getUpdateCount來(lái)檢查null是表示結(jié)果為更新計(jì)數(shù)還是表示沒(méi)有其它結(jié)果。

            當(dāng)getMoreResults返回false時(shí),它表示該SQL語(yǔ)句返回一個(gè)更新計(jì)數(shù)或沒(méi)有其它結(jié)果。因此需要調(diào)用方法getUpdateCount來(lái)檢查它是哪一種情況。在這種情況下,當(dāng)下列條件為真時(shí)表示沒(méi)有其它結(jié)果:

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

            下面的代碼演示了一種方法用來(lái)確認(rèn)已訪問(wèn)調(diào)用方法execute所產(chǎn)生的全部結(jié)果集和更新計(jì)數(shù):

          stmt.execute(queryStringWithUnknownResults);
          while(true){
          introwCount=stmt.getUpdateCount();
          if(rowCount>0){//它是更新計(jì)數(shù)
          System.out.println("Rows changed="+count);
          stmt.getMoreResults();
          continue;
          }
          if(rowCount==0){//DDL命令或0個(gè)更新
          System.out.println("No rows changed or statement was DDL command");
          stmt.getMoreResults();
          continue;
          }
          //執(zhí)行到這里,證明有一個(gè)結(jié)果集
          //或沒(méi)有其它結(jié)果
          ResultSet rs=stmt.getResultSet();
          if(rs!=null){
          ...//使用元數(shù)據(jù)獲得關(guān)于結(jié)果集列的信息
          while(rs.next()){
          ...//處理結(jié)果
          stmt.getMoreResults();
          continue;
          }
          break;//沒(méi)有其它結(jié)果
           
          posted on 2006-03-22 20:46 konhon 優(yōu)華 閱讀(413) 評(píng)論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 澄江县| 嘉禾县| 儋州市| 台湾省| 西吉县| 巨野县| 额尔古纳市| 定南县| 黑水县| 南开区| 舒城县| 大城县| 正蓝旗| 崇礼县| 体育| 八宿县| 噶尔县| 盐城市| 循化| 旺苍县| 汝城县| 会昌县| 镇坪县| 确山县| 山东| 湘潭市| 湟中县| 宁都县| 楚雄市| 卫辉市| 旅游| 龙泉市| 眉山市| 页游| 柳林县| 镇江市| 龙江县| 长乐市| 广东省| 南雄市| 衡东县|