乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      JDBC接口規(guī)范

       liang1234_ 2019-05-19

      前言

      JDBC(JavaDatabase Connectivity)表示Java查詢引擎連接,由一組用Java編程語言編寫的類和接口組成。JDBC為Java程序訪問關(guān)系型查詢引擎提供了編程接口,為查詢引擎開發(fā)人員提供了一個標(biāo)準(zhǔn)的API,使他們能夠用JavaAPI 來編寫查詢引擎應(yīng)用程序,而不必為訪問不同查詢引擎編寫不同的程序。

      隨著J2SE版本的不斷發(fā)展,JDBC規(guī)范也不斷完善。發(fā)展到目前為止,JDBC規(guī)范已經(jīng)發(fā)到3.0版本。該版本相對于以前的2.0版本又提供了很多新的特性,比如保存點(diǎn)、查詢計劃的參數(shù)信息、多結(jié)果集、自動生成鍵等。

      查詢引擎 JDBC驅(qū)動程序基本實(shí)現(xiàn)了JDBC3.0規(guī)范,尤其針對JDBC3.0規(guī)范中的新增特性,給出了很好的支持。對于這些新的特性的支持,為用戶提供了更為方便的編寫查詢引擎應(yīng)用程序的方法,使得用戶編寫應(yīng)用程序?qū)⒏痈咝В帉懙膽?yīng)用程序也更加健壯。

      本規(guī)范結(jié)合查詢引擎的特點(diǎn),針對JDBC 的基本概念和基本技術(shù),定義查詢引擎JDBC標(biāo)準(zhǔn)規(guī)范。

      本規(guī)范適用于所有查詢引擎的用戶。


      1.2.1      建立連接

      打開一個與查詢引擎的連接,需要調(diào)用DriverManager.getConnection()方法。通過調(diào)用該方法,可以取得一個Connection類的實(shí)例(Instance),這個實(shí)例就在應(yīng)用程序和查詢引擎建立了一個連接,使用這個連接,我們就能通過查詢引擎系統(tǒng)操作各個節(jié)點(diǎn)了。要得到Connection的實(shí)例,就需要應(yīng)用程序輸入用戶名、密碼、查詢引擎 JDBC驅(qū)動特定的連接語句以及想要連接的查詢引擎庫名稱。用戶將有兩種連接方法來與查詢引擎建立連接。

      1.        指定URL、用戶名和密碼

      下面這個方法用URL、用戶名、密碼作為參數(shù):

      Class.forName(“com.scistor.swift.jdbc.Driver”);

      getConnection(String URL, String user, Stringpassword);

      URL的格式是:

      jdbc:swift://host/database

      jdbc:swift://host:port/database

      其中:

      參數(shù)

      參數(shù)說明

      host

      服務(wù)器的主機(jī)名。

      port

      服務(wù)器監(jiān)聽的端口號。缺省時是查詢引擎默認(rèn)的端口號(2003)

      database

      查詢引擎庫名。此處的database就是在安裝時創(chuàng)建的查詢引擎庫所對應(yīng)的名字

      比如想要連接查詢引擎,它的URL、用戶名、密碼分別是:

             Stringurl = “jdbc:swift://localhost/SYSTEM”;

             Stringname = “SYSDBA”;

             Stringpassword = “SYSDBA”;

      那么就可以很容易的獲得一個與查詢引擎的連接了

             Connectioncon = DriverManager.getConnection(url,name,password);

      這就意味著用戶通過用戶名”SYSDBA”,密碼”SYSDBA”連接到了本地的名稱為“SYSTEM”的查詢引擎。

      2.        指定URL和Properties對象

      指定URL的方法同上面一樣,現(xiàn)在我們就來指定Properties對象:

      java.util.Properties info = newjava.util.Properties();

      info.setProperty(“user”,”SYSDBA”);

      info.setProperty(“password”,”SYSDBA”);

      現(xiàn)在就可以獲得連接了:

      Connection con =DriverManager.getConnection(url,info);

      1.2.2      創(chuàng)建Statement對象

      一旦連接上了查詢引擎,也就是說,已經(jīng)獲得了一個Connection的實(shí)例,那么就可以通過該Connection實(shí)例創(chuàng)建一個Statement對象。通過Statement對象來處理不同的SQL語句。我們就用前面獲得的Connection實(shí)例con來創(chuàng)建一個Statement對象,下面就是一個創(chuàng)建Statement對象的例子:

      Statement stmt = con.createStatement();

      這個操作是完全遵循JDBC標(biāo)準(zhǔn)規(guī)范的,沒有任何要處理關(guān)于特定查詢引擎 JDBC驅(qū)動的地方。

      1.2.3      執(zhí)行語句

      如果需要查詢查詢引擎中的數(shù)據(jù),只需要調(diào)用Statement對象的executeQuery()方法。這個方法以SQL語句作為參數(shù),方法執(zhí)行完后返回一個JDBC的ResultSet對象。為了保持連續(xù)性,我們就使用上面已經(jīng)創(chuàng)建的Statement對象。比如我們要從一張表名為TEMP的表中選出所有數(shù)據(jù),我們只要簡單的調(diào)用executeQurey()方法:

      ResultSet rs = stmt.executeQuery(“SELECT * FROMTEMP”);

      同上面一樣,這個操作也是完全遵循JDBC標(biāo)準(zhǔn)規(guī)范的,沒有任何要處理關(guān)于特定查詢引擎 JDBC驅(qū)動的地方。

      注:假如我們已經(jīng)在查詢引擎中創(chuàng)建了一個名為TEMP的表,它有兩列分別為ID(INT),VALUE(STRING)。后面的章節(jié)將多次使用到這個表。

      1.2.4      處理結(jié)果集

      一旦執(zhí)行了SQL語句,獲得了ResultSet對象,那么就可以通過調(diào)用Resulset對象中的next()操作遍歷ResultSet操作,以獲得每條記錄。如果next()方法返回為true,那么就意味著現(xiàn)在有記錄可以讀取出來,接著就可以調(diào)用ResultSet對象的getXXX()方法來取得對應(yīng)列的值,XXX代表了要取得的列的類型,該方法是以列序號或列名為參數(shù)的,下面就從上面獲得的ResultSet對象中取得數(shù)據(jù):

      while (rs.next())

      System.out.println(rs.getString(2));

      在這里TEMP表中第二列的類型STRING,所以我們使用了rs對象的getString()方法。當(dāng)然這里也可以通過調(diào)用rs.getString(paramName)來獲得值。這個方法也是遵循JDBC標(biāo)準(zhǔn)的。如果一直向下做遍歷,當(dāng)沒有記錄的時候,next()就會返回false。

      1.2.5      關(guān)閉Statement對象和結(jié)果集

      當(dāng)不再需要使用Statement和Resultset數(shù)據(jù)之后,就必須顯式的關(guān)閉已經(jīng)創(chuàng)建的Statement對象。JDBC驅(qū)動程序沒有自動地釋放這些對象的功能,應(yīng)用程序必須顯式的調(diào)用Statement的close()方法和ResultSet的close()方法。一旦已經(jīng)顯式的關(guān)閉了已經(jīng)創(chuàng)建的對象,就不能再使用這些對象了。如果已經(jīng)不再使用某些Statement對象和Resultset對象,但是卻不去釋放它,那將會造成嚴(yán)重的內(nèi)存泄漏。如果創(chuàng)建了大量的Statement和ResultSet對象,但是卻不釋放它們,應(yīng)用程序可能最終會造成OUT OF MEMORY的后果。

      比如應(yīng)用程序中的Statement對象是stmt,ResultSet對象是rs,就可以這樣關(guān)閉它:

      rs.close();

      stmt.close();

      雖然關(guān)閉了Statement對象時,創(chuàng)建該Statement對象的Connection仍然與查詢引擎保持連接,應(yīng)用程序仍然可以用它創(chuàng)建其他的Statement對象。

      1.2.6      關(guān)閉與查詢引擎的連接

      最后,當(dāng)不再需要與查詢引擎的連接時,就需要關(guān)閉Connection對象。調(diào)用Connection的close()方法,就會關(guān)閉連接,釋放網(wǎng)絡(luò)上的資源。

      con.close();

       

      1.3數(shù)據(jù)類型的映射

      JDBC驅(qū)動支持大多數(shù)由JDBC3.0規(guī)范所要求的類型。在類型映射中,我們將討論JAVA類型、JDBC類型以及查詢引擎類型是如何進(jìn)行相互映射的。比如前臺的String對應(yīng)于JDBC類型中的那種,又對應(yīng)于查詢引擎中的那種類型。

      表3-1是查詢引擎數(shù)據(jù)類型。

      序號

      類型

      描述

      有效范圍

      1

      smallint

      整型數(shù)據(jù)

      [-32768, 32767]

      2

      int

      整型數(shù)據(jù)

      [-2147483648, 2147483647]

      3

      bigint

      整型數(shù)據(jù)

      [-9223372036854775808, 9223372036854775807]

      4

      double precision

      浮點(diǎn)雙精度數(shù)

      [2.2250738585072014e-308,1.7976931348623158e+308]

      5

      real

      浮點(diǎn)精度數(shù)字

      [-1E+308, 1E+308]

      6

      text

      可變長度的字符數(shù)據(jù)

      最大長度為1G個字符

      7

      char(n)

      定長字符串

      長度為n

      8

      varchar(n)

      變長字符串

      最大長度為n

      9

      bytea

      變長的二進(jìn)制字串

      理論上沒有限制,可以達(dá)到4個G

      10

      boolean

      布爾類型

      TRUE/FALSE

      11

      timestamp

      時間戳

      ‘2013-01-01 00:00:00’

       

      查詢引擎數(shù)據(jù)類型這一列列舉了在查詢引擎中的數(shù)據(jù)類型。

      JDBC 類型這一列列舉JDBC標(biāo)準(zhǔn)支持的,并在java.sql.Types類中有定義的類型。

      標(biāo)準(zhǔn)JAVA類型這一列列舉了在JAVA語言中定義的標(biāo)準(zhǔn)類型。

      表3-2 查詢引擎數(shù)據(jù)類型、JDBC類型和標(biāo)準(zhǔn)JAVA類型之間的映射。

      序號

      查詢引擎

      數(shù)據(jù)類型

      JDBC類型

      標(biāo)準(zhǔn)JAVA類型

      1

      smallint

      java.sql.Types.SMALLINT

      short

      2

      Int

      java.sql.Types.INT

      int

      3

      Bigint

      java.sql.Types.BIGINT

      long

      4

      double precision

      java.sql.Types.DOUBLE

      double

      5

      Real

      java.sql.Types.FLOAT

      double

      6

      Text

      java.sql.Types.VARCHAR

      java.lang.String

      7

      char(n)

      java.sql.Types.VARCHAR

      java.lang.String

      8

      varchar(n)

      java.sql.Types.VARCHAR

      java.lang.String

      9

      bytea

      java.sql.Types.BINARY

      byte[]

      10

      boolean

      java.sql.Types.BOOLEAN

      boolean

      11

      timestamp

      java.sql.Types.TIMESTAMP

      java.sql.Timestamp

       

      1.4處理SQL異常

      在運(yùn)行應(yīng)用程序的時候,可能會拋出很多異常。可能由于查詢引擎沒有打開導(dǎo)致連接不上,插入的數(shù)據(jù)類型不符,想要刪除的表不存在等等。由JDBC拋出的異常大多是java.sql.SQLException或者它的子類的對象。這些異常有可能是從查詢引擎中拋出來的,也有可能是從前臺的JDBC驅(qū)動拋出的。比如上面提到的服務(wù)器連接不上就是由JDBC驅(qū)動拋出的異常,想要刪除的表不存在就是由查詢引擎中拋出的錯誤。

      那么如何處理這些由JDBC拋出的異常呢?由JDBC拋出的java.sql.SQLException和它的子類,一般都會包括錯誤描述,標(biāo)準(zhǔn)的SQL State和廠商特定的錯誤編碼。錯誤描述、SQL State和錯誤編號會在附錄中給出。

      java.sql.SQLException提供了獲取這些信息的方法。

      通過調(diào)用SQLException的getMessage()方法,可以獲得由JDBC驅(qū)動或者查詢引擎報出的錯誤。通過這個錯誤描述,就可以知道錯誤的原因了。

      通過調(diào)用SQLException的getErrorCode()方法,可以獲得由廠商特定錯誤編碼,在有些情況下可能不返回錯誤描述,只返回一個空的字符串。

      通過調(diào)用SQLException的getState()的方法,可以獲得標(biāo)準(zhǔn)的SQL State。SQL State是由5個數(shù)字組成的字符串。

      下面這例子打印出調(diào)用getMessage方法所得到的錯誤信息。

      try{

             <somecode>

      }

      catch(SQLException se){

             System.out.println(“錯誤信息:”+se.getMessage());

      }

      SQLException類也允許打印出堆棧式的出錯信息。打印的內(nèi)容將包括錯誤描述,和這個錯誤從拋出一直到被捕捉到所經(jīng)過的所有被調(diào)用的方法。

      下面給出了如何打印出堆棧信息的方法。

      try{

             <somecode>

      }

      catch(SQLException se){

             se.printStackTrace();}

      第2章    查詢引擎 JDBC驅(qū)動對于 JDBC規(guī)范的支持

      查詢引擎 JDBC驅(qū)動是基于JDBC3.0規(guī)范而實(shí)現(xiàn)的。在以前的JDBC2.0規(guī)范中,將API分為核心API和擴(kuò)展API。JDBC3.0規(guī)范包含了JDBC2.0規(guī)范的核心API以及JDBC2.0的擴(kuò)展API,并添加了一些新的特性。查詢引擎 JDBC驅(qū)動實(shí)現(xiàn)了JDBC3.0規(guī)范中的大部分接口,主要包括下列接口:

      l  java.sql.Dirver

      l  java.sql.Connection

      l  java.sql.Statement

      l  java.sql.ResultSet

      l  java.sql.DatabaseMetaData

      l  java.sql.ResultSetMetaData

      查詢引擎 JDBC驅(qū)動對于上述每個接口的方法,基本上提供了實(shí)現(xiàn)。除了JDBC要求的基本特性之外,比如執(zhí)行一般的SQL語句,可以對從結(jié)果集取得數(shù)據(jù)等,遵照J(rèn)DBC3.0的規(guī)范,查詢引擎 JDBC驅(qū)動還提供了一些JDBC的特殊特性:

      按照J(rèn)DBC規(guī)范,提供了類型之間的相互轉(zhuǎn)換,比如int和String之間的轉(zhuǎn)化,String和java.sql.Date之間的轉(zhuǎn)化,具體的內(nèi)容,請參照《JDBC3.0規(guī)范》

      實(shí)現(xiàn)了對ResultSet的各種特性的支持,這些特性是在創(chuàng)建Statement對象、PreparedStatement對象和CallableStatement對象時指定的。

      Type包括:

      l  TYPE_FORWARDONLY

      Concurrency包括:

      l  CONCUR_READ_ONLY

      Holdability包括:

      l  不支持

      在查詢引擎 JDBC驅(qū)動中對這些特性都給出了較好的實(shí)現(xiàn)。具體說明將在結(jié)果集一章中給出。

      允許用戶在Statement和ResultSet中設(shè)置fetchSize,通過設(shè)置fetchSize,對于記錄數(shù)很大的情況下,可以極大的降低對內(nèi)存的使用量。

       

      第3章    執(zhí)行SQL語句和處理結(jié)果集

      查詢引擎 JDBC驅(qū)動提供了Statement對象用于發(fā)送SQL語句到查詢引擎。

      3.1創(chuàng)建Statement對象

      建立了到查詢引擎的連接之后,就可以使用該連接發(fā)送SQL語句。Statement對象通過Connection接口的方法createStatement創(chuàng)建,例如:

      Connection conn = DriverManager.getConnection(url,"SYSDBA","SYSDBA");

      Statement stmt = conn.createStatement();

      在創(chuàng)建Statement對象的時候,可以通過參數(shù)來指定產(chǎn)生結(jié)果集的屬性,詳見“結(jié)果集處理”一章。為了執(zhí)行Statement對象,被發(fā)送到查詢引擎的SQL語句將被作為參數(shù)提供給Statement的方法,例如:

      String sql = “SELECT * FROM TEMP”;

      ResultSet rs = stmt.executeQuery(sql);

      3.2使用Statement對象執(zhí)行SQL語句

      Statement接口提供了三種執(zhí)行SQL語句的方法:executeQuery、executeUpdate和execute。使用哪一個方法由SQL語句執(zhí)行后產(chǎn)生的結(jié)果而決定。

      方法executeQuery用于產(chǎn)生單個結(jié)果集的語句,例如SELECT語句,執(zhí)行executeQuery方法將返回一個結(jié)果集對象。方法executeUpdate用于執(zhí)行INSERT、UPDATE或DELETE語句以及SQL DDL(數(shù)據(jù)定義語言)語句,例如CREATE TABLE和DROP TABLE。由于INSERT、UPDATE或DELETE語句的效果是修改表中若干行中的一列或多列,所以executeUpdate的返回值是一個整數(shù),指示受影響的行數(shù)(即更新記錄數(shù));對于CREATETABLE或DROP TABLE等不操作行的語句,executeUpdate的返回值總是為零(我們把這個零返回值也視為更新記錄數(shù),即沒有記錄受到影響)。當(dāng)被執(zhí)行的SQL語句返回一個更新記錄數(shù)、一個結(jié)果集、多結(jié)果集或者SQL語句的類型未知,則使用execute方法。下面的例子演示了以上方法的使用。

      使用executeQuery方法處理SQL數(shù)據(jù)查詢語句:

      Statement stmt = conn.createStatement();

      String sql = “SELECT ID,VALUE FROM TEMP”;

      ResultSet rs = stmt.executeQuery(sql);

      while (rs.next()){

      // 處理獲得的數(shù)據(jù)記錄

      }

      使用executeUpdate方法處理SQL數(shù)據(jù)操縱語句:

      Statement stmt = conn.createStatement();

      String sql = “UPDATETEMPSETVALUE = ‘VALUE10’WHEREID = 10”

      int rows = stmt.executeUpdate(sql);

      if (rows >= 0) {

      //<some code>

      }

      使用executeUpdate方法處理SQL數(shù)據(jù)定義語句:

      Statement stmt = conn.createStatement();

      String sql = “CREATE TABLE TEST(ID INT, VALUEVARCHAR(50))”;

      int updcount = stmt.executeUpdate(sql);

      if (updcount== 0) {

      // <some code>

      }

      使用execute方法處理SQL語句:

      String sql;

      // 對字符串sql進(jìn)行賦值,單條SQL語句

      ...

      Statement stmt = conn.createStatement();

      boolean b = stmt.execute(sql);

      if (b) {

      // 說明返回的是ResultSet對象

      ResultSet rs;

      rs = stmt.getResultSet();

      while (rs.next()) {

      //<some code>

      }

      }

      else {

      // 說明返回的是更新記錄數(shù)

      int rows = stmt.getUpdateCount();

      if (rows >= 0) {

                    //<somecode>

      }

      }

      需要說明的是,執(zhí)行上面提及的任一種方法都將關(guān)閉所調(diào)用的Statement對象的當(dāng)前打開結(jié)果集(如果存在)。這意味著在重新執(zhí)行Statement對象之前,需要完成對當(dāng)前ResultSet對象的處理。

      3.3使用execute()方法

      當(dāng)SQL語句執(zhí)行后會返回ResultSet對象或更新記錄數(shù),通常使用execute方法。當(dāng)同時執(zhí)行多個SQL語句、執(zhí)行某個存儲過程或動態(tài)執(zhí)行未知SQL字符串(即應(yīng)用程序程序員在編譯時未知)時,就有可能出現(xiàn)多個結(jié)果的情況,因此在這種情況下就需要使用execute(),因?yàn)閑xecute()方法同時適用于對有ResultSet對象返回和有更新記錄數(shù)返回的情況。

      如果不知道返回結(jié)果的類型,則可以通過execute方法的返回值來進(jìn)行判斷。如果結(jié)果是ResultSet對象,則方法execute返回true;如果結(jié)果類型是更新紀(jì)錄數(shù),則返回false。如果返回int,則意味著結(jié)果是更新記錄數(shù)或執(zhí)行的語句是DDL命令。在調(diào)用方法execute之后可以調(diào)用getResultSet()或getUpdateCount()。其中g(shù)etResultSet()方法獲得當(dāng)前結(jié)果集,而getUpdateCount()獲得記錄的更新數(shù)。

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

      下面給了一個示例,用于執(zhí)行未知sql語句的情況下作判斷:

      boolean retVal = stmt.execute( sql);

      if (retVal){

             //有結(jié)果集返回

      ResultSet rs = stmt.getResultSet();

             //處理結(jié)果集

             //<somecode>

      }

      else {

             //說明可能有更新記錄

             intupdateCount = stmt.getUpdateCount();

             if(updateCount != -1) {

                    //對有更新記錄的情況作處理

                    //<somecode>

      }

      }

       

      3.4關(guān)閉Statement對象

      作為一種好的編程風(fēng)格,對于不再使用的Statement對象應(yīng)顯式地關(guān)閉它們,這可以使得Statement對象使用的外部資源立即被釋放。同時,應(yīng)顯示關(guān)閉由Statement對象所創(chuàng)建的Resultset對象,但是ResultSet對象使用的資源只有到垃圾收集機(jī)制啟動時,才會真正的釋放他們。所以,當(dāng)一個對象不需要時,無論是ResultSet對象還是Statement對象,都應(yīng)該盡早地釋放他們。

      第4章    結(jié)果集(ResultSet)的特性

      本章內(nèi)容包括:

      4.1概述

      在JDBC3.0規(guī)范中結(jié)果集的特性,包括可滾動性(scrollability)、可定位(positioning)、敏感性(sensitivity)、可更新性(updatability)和可保持性(holdability)。這些特性可以分為Type,Concurrency和Holdability三大類,下表為查詢引擎對各特性的支持情況定義:

      ResultSet Types

      支持程度

      ResultSet Concurrency

      支持程度

      ResultSet Holdability

      支持程度

      TYPE_FORWARD_ONLY

      支持

      CONCUR_READ_ONLY

      支持

      HOLD_CURSOR_OVER_COMMIT

      不支持

      TYPE_SCROLL_INSENSITIVE

      不支持

      CONCUR_UPDATABLE

      不支持

      CLOSE_CURSOR_AT_COMMIT

      不支持

      TYPE_SCROLL_SENSITIVE

      不支持

       

       

       

       

       

      4.2設(shè)置結(jié)果集大小

      查詢引擎 JDBC驅(qū)動提供了允許用戶設(shè)置結(jié)果集大小(即上面結(jié)果集的敏感性中提到的窗口的大?。┑姆椒āMㄟ^設(shè)置結(jié)果集的大小,驅(qū)動每次從查詢引擎取得的記錄數(shù)將不超過用戶設(shè)置的大小。比如TEMP表的實(shí)際記錄數(shù)有100萬條,用戶如果把它一次全部取出來,就會耗用大量的內(nèi)存;用戶可以設(shè)置結(jié)果集的大小,比如為1萬,那么查詢引擎 JDBC驅(qū)動將每次只從后臺查詢引擎取1萬條。當(dāng)用戶作游標(biāo)移動操作時,如果JDBC發(fā)現(xiàn)那條記錄還沒從查詢引擎取出來,就會從查詢引擎取出那條記錄。

      stmt.setFetchSize(10000);

      ResultSet rs = stmt.executeQuery(“SELECT * FROMTEMP”);

      while(rs.next()) {

      //如果調(diào)用到第10001次,驅(qū)動程序會再從后臺取10000條,把原來的記錄

      //覆蓋掉,這樣內(nèi)存中始終只是用了10000條記錄內(nèi)存的大小

      }

      在缺省情況下,即用戶不設(shè)fetchSize時, JDBC驅(qū)動會將所有記錄一次取出來。因此對于記錄數(shù)極大的情況下(比如100萬條)可能會耗用大量的內(nèi)存。但是如果用戶將fetchSize設(shè)得不夠大,會增加網(wǎng)絡(luò)的開銷和查詢引擎的查詢操作,因此在這種情況下應(yīng)用程序的執(zhí)行速度將不如缺省的情況。用戶對于內(nèi)存耗用量和執(zhí)行速度必須有一個折中的考慮,取得最好的平衡點(diǎn)。

      第5章    MetaData信息

      MetaData是一種重要的機(jī)制,可以供用戶來獲取相應(yīng)對象(目標(biāo)數(shù)據(jù)源、結(jié)果集,參數(shù)信息等)的詳細(xì)描述信息。在JDBC驅(qū)動中,有三個接口專門提供相應(yīng)的MetaData信息:

      DatabaseMetaData:用于描述查詢引擎的元數(shù)據(jù)信息;

      ResultSetMetaData:用于描述ResultSet對象的元數(shù)據(jù)信息;

      ParameterMetaData:用于描述PreparedStatement、CallableStatement對象參數(shù)屬性的元數(shù)據(jù)信息。

      下面將分別介紹這三個接口相應(yīng)方法的使用。

      5.1DatabaseMetaData

      DatabaseMetaData接口的實(shí)現(xiàn)是為了給用戶提供目標(biāo)數(shù)據(jù)源的信息,應(yīng)用程序根據(jù)接口中的各種方法得到相應(yīng)的信息,進(jìn)而決定如何與之交互。

      獲取DatabaseMeta信息的步驟是:首先創(chuàng)建DatabaseMetaData對象:

      DatabaseMetaData dbmd = conn.getMetaData();

      利用dbmd對象,調(diào)用DatabaseMetaData接口的相應(yīng)方法就可以獲得查詢引擎和JDBC驅(qū)動程序的一些信息,例如:

      int majorVersion = dbmd.getJDBCMajorVersion(); // 獲得JDBC 驅(qū)動程序的主版本號

      DatabaseMetaData接口包括了超過150種的方法,根據(jù)提供信息的類型,可以把這些方法分為五類:

      提供數(shù)據(jù)源總體信息的方法:比如獲得查詢引擎的主版本號版本信息的getDatabaseMajorVersion();

      說明數(shù)據(jù)源是否支持某一特定特征的方法:比如根據(jù)方法supportsANSI92EntryLevelSQL()的返回值可以知道查詢引擎是否支持ANSI92入門級SQL語法;

      說明數(shù)據(jù)源限制的方法:比如通過getMaxConnections()方法可以得到查詢引擎支持的最大連接數(shù);

      說明數(shù)據(jù)源支持哪些SQL對象,他們的屬性是什么:比如getTables()、getPrimaryKeys()方法;

      說明數(shù)據(jù)源提供的事務(wù)支持:比如通過getDefaultTransactionIsolation()方法可以得到查詢引擎缺省的事務(wù)隔離級別。

      建議支持接口如下:

      函數(shù)

      功能

      intgetJDBCMajorVersion()

      獲取JDBC主版本號

      String getDatabaseProductName()

      獲取系統(tǒng)名稱

      String getDatabaseProductVersion()

      獲取版本號

      String getDriverName()

      獲取驅(qū)動名稱

      String getDriverVersion()

      獲取驅(qū)動版本號

      String getURL()

      獲取引擎URL

       

      關(guān)于各種方法的具體說明請參閱JAVA2 SDK DOCUMENT。

      5.2ResultSetMetaData

      ResultSetMetaData接口提供的方法用于獲取一個ResultSet對象各個列的類型和屬性,比如列名、列數(shù)據(jù)類型、列所屬的表、以及列是否允許值為 NULL等等。

      下面的例子演示了ResultSetMetaData的創(chuàng)建和使用:

      假如有一個表StudentInfo(StuIDINT,StuName VARCHAR(10)),下面的例子可以得到這個表的各個列的類型名稱:

      String sql = “SELECT StuID, StuName FROMStudentInfo”;

      ResultSet rs = stmt.executeQuery(sql);

      ResultSetMetaData rsmd = rs.getMetaData();

      for(int i = 1; i <= rsmd.getColumnCount(); i++)

      {

                    //依次打印出列的類型名稱

                    StringtypeName = rsmd.getColumnTypeName(i);

                    System.out.println(typeName);

      }

      建議支持接口如下:

       

      函數(shù)

      功能

      intgetColomnCount()

      獲取字段個數(shù)

      String getColumnName(int column)

      根據(jù)結(jié)果集中字段索引獲取字段名

      intgetColumnType(int column)

      獲取字段的類型代碼

      String getColumnTypeName(int column)

      獲取字段類型的名稱

       

      關(guān)于各種方法的具體說明請參閱JAVA2 SDK DOCUMENT。

       

      第6章    批處理

      批處理更新機(jī)制允許多個更新操作提交給數(shù)據(jù)源一次處理。相比于一次次單獨(dú)執(zhí)行更新,這樣的處理方式可以大大的提高效率和性能。Statement、PreparedStatement對象均可以通過addBatch、executeBatch等方法使用批處理更新方式。

      6.1Statement中的批處理

      當(dāng)一個Statement對象創(chuàng)建的時候,它的批處理隊列是空的。通過調(diào)用addBatch()方法,可以將作為參數(shù)的SQL語句加入隊列中。特別需要指出的是,遵照J(rèn)DBC3.0規(guī)范,所有加入隊列的SQL語句必須是執(zhí)行后返回結(jié)果為更新記錄數(shù)的語句(即insert,delete, update語句和DDL語句),否則將拋出SQLException異常。

      如果不打算提交批更新隊列中的SQL語句,需要調(diào)用clearBatch方法來清空批處理隊列。執(zhí)行批處理更新使用executeBatch方法即可。需要注意的一點(diǎn):在使用批處理更新之前必須先禁用AutoCommit模式。

      下面是一個例子:

      //改變auto-commit模式

      conn.setAutoCommit(false);

      Statementstmt = conn.createStatement();

      //設(shè)置SQL語句

      stmt.addBatch("INSERTINTO employee VALUES (1024, 'Joe Jones')");

      stmt.addBatch("INSERTINTO department VALUES (6, 'Shoe')");

      stmt.addBatch("INSERTINTO emp_dept VALUES (1024, 6)");

      //執(zhí)行批處理更新

      int[]updateCounts = stmt.executeBatch();

      conn.commit();

      最后說明一點(diǎn),在批處理隊列當(dāng)中不允許設(shè)置保存點(diǎn)(savepoint)。如果要設(shè)置,必須在第一條SQL語句被添加到批處理隊列中之前。

      6.2PreparedStatement中的批處理

      在PreparedStatement對象中使用批處理更新機(jī)制,是指先對SQL語句執(zhí)行查詢優(yōu)化,然后在批處理隊列中置入多組輸入?yún)?shù),而后提交數(shù)據(jù)源一次處理。下面是一個例子:

      //改變auto-commit模式

      conn.setAutoCommit(false);

      Stringsql = “INSERT INTO TEMP(ID,VALUE) VALUES(?,?)”;

      //先做查詢優(yōu)化

      PreparedStatementpstmt = conn.prepareStatement("sql”);

       

      //設(shè)置參數(shù)值

      pstmt.setInt(1,200);

      pstmt.setString(2,"Tom Kaufmann");

      pstmt.addBatch();

      //設(shè)置參數(shù)值

      pstmt.setInt(1,300);

      pstmt.setString(2,"Mike Barnes");

      pstmt.addBatch();

       

      //執(zhí)行,取得更新記錄

      int[]updateCounts = pstmt.executeBatch();

      conn.commit();

      6.3批處理中的異常處理

      在批處理執(zhí)行過程中,如果有一條語句執(zhí)行出錯,執(zhí)行將不再繼續(xù)下去,查詢引擎JDBC將會拋出BatchUpdateException,該異常是SQLException的子類。在BatchUpdateException中提供了getUpdateCounts()方法,該方法的返回值是一個int數(shù)組。同前面executeBatch()方法一樣,該返回數(shù)組是一個記錄的更新數(shù),數(shù)組中的每個值,都是相應(yīng)SQL語句在查詢引擎中更新的記錄數(shù)。不過getUpdateCounts()返回的數(shù)組長度,為正確執(zhí)行的SQL語句數(shù),而不是批處理中所有的SQL語句數(shù)。因此,getUpdateCounts()中包含的記錄更新數(shù),將只包含正確執(zhí)行的SQL語句,而不包含錯誤執(zhí)行或沒有執(zhí)行到的SQL語句。

      第7章    B參考資料

      關(guān)于更詳細(xì)的JDBC Driver 的信息,可以參考JAVA2 SDK DOCUMENT和JDBC3.0規(guī)范.可以在http://java./products/jdbc/index.html獲得相關(guān)文檔。

       

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多