JDBC接口規范


前言

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

隨着J2SE版本的不斷發展,JDBC規范也不斷完善。發展到目前為止,JDBC規范已經發到3.0版本。該版本相對於以前的2.0版本又提供了很多新的特性,比如保存點、查詢計划的參數信息、多結果集、自動生成鍵等。

查詢引擎 JDBC驅動程序基本實現了JDBC3.0規范,尤其針對JDBC3.0規范中的新增特性,給出了很好的支持。對於這些新的特性的支持,為用戶提供了更為方便的編寫查詢引擎應用程序的方法,使得用戶編寫應用程序將更加高效,編寫的應用程序也更加健壯。

本規范結合查詢引擎的特點,針對JDBC 的基本概念和基本技術,定義查詢引擎JDBC標准規范。

本規范適用於所有查詢引擎的用戶。


1.2.1      建立連接

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

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

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

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

getConnection(String URL, String user, Stringpassword);

URL的格式是:

jdbc:swift://host/database

jdbc:swift://host:port/database

其中:

參數

參數說明

host

服務器的主機名。

port

服務器監聽的端口號。缺省時是查詢引擎默認的端口號(2003)

database

查詢引擎庫名。此處的database就是在安裝時創建的查詢引擎庫所對應的名字

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

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

       Stringname = “SYSDBA”;

       Stringpassword = “SYSDBA”;

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

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

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

2.        指定URL和Properties對象

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

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

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

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

現在就可以獲得連接了:

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

1.2.2      創建Statement對象

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

Statement stmt = con.createStatement();

這個操作是完全遵循JDBC標准規范的,沒有任何要處理關於特定查詢引擎 JDBC驅動的地方。

1.2.3      執行語句

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

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

同上面一樣,這個操作也是完全遵循JDBC標准規范的,沒有任何要處理關於特定查詢引擎 JDBC驅動的地方。

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

1.2.4      處理結果集

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

while (rs.next())

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

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

1.2.5      關閉Statement對象和結果集

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

比如應用程序中的Statement對象是stmt,ResultSet對象是rs,就可以這樣關閉它:

rs.close();

stmt.close();

雖然關閉了Statement對象時,創建該Statement對象的Connection仍然與查詢引擎保持連接,應用程序仍然可以用它創建其他的Statement對象。

1.2.6      關閉與查詢引擎的連接

最后,當不再需要與查詢引擎的連接時,就需要關閉Connection對象。調用Connection的close()方法,就會關閉連接,釋放網絡上的資源。

con.close();

 

1.3數據類型的映射

JDBC驅動支持大多數由JDBC3.0規范所要求的類型。在類型映射中,我們將討論JAVA類型、JDBC類型以及查詢引擎類型是如何進行相互映射的。比如前台的String對應於JDBC類型中的那種,又對應於查詢引擎中的那種類型。

表3-1是查詢引擎數據類型。

序號

類型

描述

有效范圍

1

smallint

整型數據

[-32768, 32767]

2

int

整型數據

[-2147483648, 2147483647]

3

bigint

整型數據

[-9223372036854775808, 9223372036854775807]

4

double precision

浮點雙精度數

[2.2250738585072014e-308,1.7976931348623158e+308]

5

real

浮點精度數字

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

6

text

可變長度的字符數據

最大長度為1G個字符

7

char(n)

定長字符串

長度為n

8

varchar(n)

變長字符串

最大長度為n

9

bytea

變長的二進制字串

理論上沒有限制,可以達到4個G

10

boolean

布爾類型

TRUE/FALSE

11

timestamp

時間戳

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

 

查詢引擎數據類型這一列列舉了在查詢引擎中的數據類型。

JDBC 類型這一列列舉JDBC標准支持的,並在java.sql.Types類中有定義的類型。

標准JAVA類型這一列列舉了在JAVA語言中定義的標准類型。

表3-2 查詢引擎數據類型、JDBC類型和標准JAVA類型之間的映射。

序號

查詢引擎

數據類型

JDBC類型

標准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異常

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

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

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

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

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

通過調用SQLException的getState()的方法,可以獲得標准的SQL State。SQL State是由5個數字組成的字符串。

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

try{

       <somecode>

}

catch(SQLException se){

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

}

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

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

try{

       <somecode>

}

catch(SQLException se){

       se.printStackTrace();}

第2章    查詢引擎 JDBC驅動對於 JDBC規范的支持

查詢引擎 JDBC驅動是基於JDBC3.0規范而實現的。在以前的JDBC2.0規范中,將API分為核心API和擴展API。JDBC3.0規范包含了JDBC2.0規范的核心API以及JDBC2.0的擴展API,並添加了一些新的特性。查詢引擎 JDBC驅動實現了JDBC3.0規范中的大部分接口,主要包括下列接口:

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驅動對於上述每個接口的方法,基本上提供了實現。除了JDBC要求的基本特性之外,比如執行一般的SQL語句,可以對從結果集取得數據等,遵照JDBC3.0的規范,查詢引擎 JDBC驅動還提供了一些JDBC的特殊特性:

按照JDBC規范,提供了類型之間的相互轉換,比如int和String之間的轉化,String和java.sql.Date之間的轉化,具體的內容,請參照《JDBC3.0規范》

實現了對ResultSet的各種特性的支持,這些特性是在創建Statement對象、PreparedStatement對象和CallableStatement對象時指定的。

Type包括:

l  TYPE_FORWARDONLY

Concurrency包括:

l  CONCUR_READ_ONLY

Holdability包括:

l  不支持

在查詢引擎 JDBC驅動中對這些特性都給出了較好的實現。具體說明將在結果集一章中給出。

允許用戶在Statement和ResultSet中設置fetchSize,通過設置fetchSize,對於記錄數很大的情況下,可以極大的降低對內存的使用量。

 

第3章    執行SQL語句和處理結果集

查詢引擎 JDBC驅動提供了Statement對象用於發送SQL語句到查詢引擎。

3.1創建Statement對象

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

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

Statement stmt = conn.createStatement();

在創建Statement對象的時候,可以通過參數來指定產生結果集的屬性,詳見“結果集處理”一章。為了執行Statement對象,被發送到查詢引擎的SQL語句將被作為參數提供給Statement的方法,例如:

String sql = “SELECT * FROM TEMP”;

ResultSet rs = stmt.executeQuery(sql);

3.2使用Statement對象執行SQL語句

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

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

使用executeQuery方法處理SQL數據查詢語句:

Statement stmt = conn.createStatement();

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

ResultSet rs = stmt.executeQuery(sql);

while (rs.next()){

// 處理獲得的數據記錄

}

使用executeUpdate方法處理SQL數據操縱語句:

Statement stmt = conn.createStatement();

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

int rows = stmt.executeUpdate(sql);

if (rows >= 0) {

//<some code>

}

使用executeUpdate方法處理SQL數據定義語句:

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進行賦值,單條SQL語句

...

Statement stmt = conn.createStatement();

boolean b = stmt.execute(sql);

if (b) {

// 說明返回的是ResultSet對象

ResultSet rs;

rs = stmt.getResultSet();

while (rs.next()) {

//<some code>

}

}

else {

// 說明返回的是更新記錄數

int rows = stmt.getUpdateCount();

if (rows >= 0) {

              //<somecode>

}

}

需要說明的是,執行上面提及的任一種方法都將關閉所調用的Statement對象的當前打開結果集(如果存在)。這意味着在重新執行Statement對象之前,需要完成對當前ResultSet對象的處理。

3.3使用execute()方法

當SQL語句執行后會返回ResultSet對象或更新記錄數,通常使用execute方法。當同時執行多個SQL語句、執行某個存儲過程或動態執行未知SQL字符串(即應用程序程序員在編譯時未知)時,就有可能出現多個結果的情況,因此在這種情況下就需要使用execute(),因為execute()方法同時適用於對有ResultSet對象返回和有更新記錄數返回的情況。

如果不知道返回結果的類型,則可以通過execute方法的返回值來進行判斷。如果結果是ResultSet對象,則方法execute返回true;如果結果類型是更新紀錄數,則返回false。如果返回int,則意味着結果是更新記錄數或執行的語句是DDL命令。在調用方法execute之后可以調用getResultSet()或getUpdateCount()。其中getResultSet()方法獲得當前結果集,而getUpdateCount()獲得記錄的更新數。

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

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

boolean retVal = stmt.execute( sql);

if (retVal){

       //有結果集返回

ResultSet rs = stmt.getResultSet();

       //處理結果集

       //<somecode>

}

else {

       //說明可能有更新記錄

       intupdateCount = stmt.getUpdateCount();

       if(updateCount != -1) {

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

              //<somecode>

}

}

 

3.4關閉Statement對象

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

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

本章內容包括:

4.1概述

在JDBC3.0規范中結果集的特性,包括可滾動性(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設置結果集大小

查詢引擎 JDBC驅動提供了允許用戶設置結果集大小(即上面結果集的敏感性中提到的窗口的大小)的方法。通過設置結果集的大小,驅動每次從查詢引擎取得的記錄數將不超過用戶設置的大小。比如TEMP表的實際記錄數有100萬條,用戶如果把它一次全部取出來,就會耗用大量的內存;用戶可以設置結果集的大小,比如為1萬,那么查詢引擎 JDBC驅動將每次只從后台查詢引擎取1萬條。當用戶作游標移動操作時,如果JDBC發現那條記錄還沒從查詢引擎取出來,就會從查詢引擎取出那條記錄。

stmt.setFetchSize(10000);

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

while(rs.next()) {

//如果調用到第10001次,驅動程序會再從后台取10000條,把原來的記錄

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

}

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

第5章    MetaData信息

MetaData是一種重要的機制,可以供用戶來獲取相應對象(目標數據源、結果集,參數信息等)的詳細描述信息。在JDBC驅動中,有三個接口專門提供相應的MetaData信息:

DatabaseMetaData:用於描述查詢引擎的元數據信息;

ResultSetMetaData:用於描述ResultSet對象的元數據信息;

ParameterMetaData:用於描述PreparedStatement、CallableStatement對象參數屬性的元數據信息。

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

5.1DatabaseMetaData

DatabaseMetaData接口的實現是為了給用戶提供目標數據源的信息,應用程序根據接口中的各種方法得到相應的信息,進而決定如何與之交互。

獲取DatabaseMeta信息的步驟是:首先創建DatabaseMetaData對象:

DatabaseMetaData dbmd = conn.getMetaData();

利用dbmd對象,調用DatabaseMetaData接口的相應方法就可以獲得查詢引擎和JDBC驅動程序的一些信息,例如:

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

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

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

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

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

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

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

建議支持接口如下:

函數

功能

intgetJDBCMajorVersion()

獲取JDBC主版本號

String getDatabaseProductName()

獲取系統名稱

String getDatabaseProductVersion()

獲取版本號

String getDriverName()

獲取驅動名稱

String getDriverVersion()

獲取驅動版本號

String getURL()

獲取引擎URL

 

關於各種方法的具體說明請參閱JAVA2 SDK DOCUMENT。

5.2ResultSetMetaData

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

下面的例子演示了ResultSetMetaData的創建和使用:

假如有一個表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);

}

建議支持接口如下:

 

函數

功能

intgetColomnCount()

獲取字段個數

String getColumnName(int column)

根據結果集中字段索引獲取字段名

intgetColumnType(int column)

獲取字段的類型代碼

String getColumnTypeName(int column)

獲取字段類型的名稱

 

關於各種方法的具體說明請參閱JAVA2 SDK DOCUMENT。

 

第6章    批處理

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

6.1Statement中的批處理

當一個Statement對象創建的時候,它的批處理隊列是空的。通過調用addBatch()方法,可以將作為參數的SQL語句加入隊列中。特別需要指出的是,遵照JDBC3.0規范,所有加入隊列的SQL語句必須是執行后返回結果為更新記錄數的語句(即insert,delete, update語句和DDL語句),否則將拋出SQLException異常。

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

下面是一個例子:

//改變auto-commit模式

conn.setAutoCommit(false);

Statementstmt = conn.createStatement();

//設置SQL語句

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

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

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

//執行批處理更新

int[]updateCounts = stmt.executeBatch();

conn.commit();

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

6.2PreparedStatement中的批處理

在PreparedStatement對象中使用批處理更新機制,是指先對SQL語句執行查詢優化,然后在批處理隊列中置入多組輸入參數,而后提交數據源一次處理。下面是一個例子:

//改變auto-commit模式

conn.setAutoCommit(false);

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

//先做查詢優化

PreparedStatementpstmt = conn.prepareStatement("sql”);

 

//設置參數值

pstmt.setInt(1,200);

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

pstmt.addBatch();

//設置參數值

pstmt.setInt(1,300);

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

pstmt.addBatch();

 

//執行,取得更新記錄

int[]updateCounts = pstmt.executeBatch();

conn.commit();

6.3批處理中的異常處理

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

第7章    B參考資料

關於更詳細的JDBC Driver 的信息,可以參考JAVA2 SDK DOCUMENT和JDBC3.0規范.可以在http://java.sun.com/products/jdbc/index.html獲得相關文檔。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM