打開一個與查詢引擎的鏈接,須要調用DriverManager.getConnection()方法。經過調用該方法,能夠取得一個Connection類的實例(Instance),這個實例就在應用程序和查詢引擎創建了一個鏈接,使用這個鏈接,咱們就能經過查詢引擎系統操做各個節點了。要獲得Connection的實例,就須要應用程序輸入用戶名、密碼、查詢引擎 JDBC驅動特定的鏈接語句以及想要鏈接的查詢引擎庫名稱。用戶將有兩種鏈接方法來與查詢引擎創建鏈接。html
1. 指定URL、用戶名和密碼java
下面這個方法用URL、用戶名、密碼做爲參數:程序員
Class.forName(「com.scistor.swift.jdbc.Driver」);sql
getConnection(String URL, String user, Stringpassword);編程
URL的格式是:swift
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);
一旦鏈接上了查詢引擎,也就是說,已經得到了一個Connection的實例,那麼就能夠經過該Connection實例建立一個Statement對象。經過Statement對象來處理不一樣的SQL語句。咱們就用前面得到的Connection實例con來建立一個Statement對象,下面就是一個建立Statement對象的例子:
Statement stmt = con.createStatement();
這個操做是徹底遵循JDBC標準規範的,沒有任何要處理關於特定查詢引擎 JDBC驅動的地方。
若是須要查詢查詢引擎中的數據,只須要調用Statement對象的executeQuery()方法。這個方法以SQL語句做爲參數,方法執行完後返回一個JDBC的ResultSet對象。爲了保持連續性,咱們就使用上面已經建立的Statement對象。好比咱們要從一張表名爲TEMP的表中選出全部數據,咱們只要簡單的調用executeQurey()方法:
ResultSet rs = stmt.executeQuery(「SELECT * FROMTEMP」);
同上面同樣,這個操做也是徹底遵循JDBC標準規範的,沒有任何要處理關於特定查詢引擎 JDBC驅動的地方。
注:假如咱們已經在查詢引擎中建立了一個名爲TEMP的表,它有兩列分別爲ID(INT),VALUE(STRING)。後面的章節將屢次使用到這個表。
一旦執行了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。
當再也不須要使用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對象。
最後,當再也不須要與查詢引擎的鏈接時,就須要關閉Connection對象。調用Connection的close()方法,就會關閉鏈接,釋放網絡上的資源。
con.close();
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 |
在運行應用程序的時候,可能會拋出不少異常。可能因爲查詢引擎沒有打開致使鏈接不上,插入的數據類型不符,想要刪除的表不存在等等。由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();}
查詢引擎 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,對於記錄數很大的狀況下,能夠極大的下降對內存的使用量。
查詢引擎 JDBC驅動提供了Statement對象用於發送SQL語句到查詢引擎。
創建了到查詢引擎的鏈接以後,就可使用該鏈接發送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);
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對象的處理。
當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>
}
}
做爲一種好的編程風格,對於再也不使用的Statement對象應顯式地關閉它們,這可使得Statement對象使用的外部資源當即被釋放。同時,應顯示關閉由Statement對象所建立的Resultset對象,可是ResultSet對象使用的資源只有到垃圾收集機制啓動時,纔會真正的釋放他們。因此,當一個對象不須要時,不管是ResultSet對象仍是Statement對象,都應該儘早地釋放他們。
本章內容包括:
在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 |
不支持 |
|
|
|
|
查詢引擎 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設得不夠大,會增長網絡的開銷和查詢引擎的查詢操做,所以在這種狀況下應用程序的執行速度將不如缺省的狀況。用戶對於內存耗用量和執行速度必須有一個折中的考慮,取得最好的平衡點。
MetaData是一種重要的機制,能夠供用戶來獲取相應對象(目標數據源、結果集,參數信息等)的詳細描述信息。在JDBC驅動中,有三個接口專門提供相應的MetaData信息:
DatabaseMetaData:用於描述查詢引擎的元數據信息;
ResultSetMetaData:用於描述ResultSet對象的元數據信息;
ParameterMetaData:用於描述PreparedStatement、CallableStatement對象參數屬性的元數據信息。
下面將分別介紹這三個接口相應方法的使用。
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。
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。
批處理更新機制容許多個更新操做提交給數據源一次處理。相比於一次次單獨執行更新,這樣的處理方式能夠大大的提升效率和性能。Statement、PreparedStatement對象都可以經過addBatch、executeBatch等方法使用批處理更新方式。
當一個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語句被添加到批處理隊列中以前。
在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();
在批處理執行過程當中,若是有一條語句執行出錯,執行將再也不繼續下去,查詢引擎JDBC將會拋出BatchUpdateException,該異常是SQLException的子類。在BatchUpdateException中提供了getUpdateCounts()方法,該方法的返回值是一個int數組。同前面executeBatch()方法同樣,該返回數組是一個記錄的更新數,數組中的每一個值,都是相應SQL語句在查詢引擎中更新的記錄數。不過getUpdateCounts()返回的數組長度,爲正確執行的SQL語句數,而不是批處理中全部的SQL語句數。所以,getUpdateCounts()中包含的記錄更新數,將只包含正確執行的SQL語句,而不包含錯誤執行或沒有執行到的SQL語句。
關於更詳細的JDBC Driver 的信息,能夠參考JAVA2 SDK DOCUMENT和JDBC3.0規範.能夠在http://java.sun.com/products/jdbc/index.html得到相關文檔。