J2EE組件使用JDBC應(yīng)用程序編程接口API中包含的數(shù)據(jù)對_第1頁
J2EE組件使用JDBC應(yīng)用程序編程接口API中包含的數(shù)據(jù)對_第2頁
J2EE組件使用JDBC應(yīng)用程序編程接口API中包含的數(shù)據(jù)對_第3頁
J2EE組件使用JDBC應(yīng)用程序編程接口API中包含的數(shù)據(jù)對_第4頁
J2EE組件使用JDBC應(yīng)用程序編程接口API中包含的數(shù)據(jù)對_第5頁
已閱讀5頁,還剩54頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

3

JDBCJ2EE組件使用JDBC應(yīng)用程序編程接口(API)中包含的數(shù)據(jù)對象來提供數(shù)據(jù)庫訪問。JAVA數(shù)據(jù)對象中包含的方法能夠打開通向某一個DBMS的連接,然后發(fā)送消息(查詢)來插入、檢索、修改或刪除存儲在數(shù)據(jù)庫里的數(shù)據(jù)。DBMS使用同樣的連接把消息返回J2EE組件,這些消息包含J2EE組件請求的數(shù)據(jù)行或是

DBMS處理的狀態(tài)查詢信息。JAVA數(shù)據(jù)對象用來與DBMS返回給J2EE組件的數(shù)據(jù)進行交互。3.1

JDBC驅(qū)動程序JAVA程序員可以使用定義在JDBC

API里的高層JAVA數(shù)據(jù)對象來編寫與DBMS進行交互的程

序。JAVA數(shù)據(jù)對象把程序轉(zhuǎn)換成符合JDBC驅(qū)動程序規(guī)范的底層消息,并把消息發(fā)送到JDBC驅(qū)動程序,JDBC驅(qū)動程序再把程序翻譯成能被

DBMS理解和處理的底層消息。JDBC驅(qū)動程序使J2EE組件與數(shù)據(jù)庫無關(guān),這補充了JAVA的平臺無關(guān)性原則。功能:由DBMS制造商創(chuàng)建的JDBC驅(qū)動程序必須能夠:打開一個DBMS和J2EE組件之間的連接把J2EE組件發(fā)送的SQL語句的底層等價物翻譯為可以被DBMS處理的消息把符合JDBC規(guī)范的數(shù)據(jù)返回給JDBC驅(qū)動程序把符合JDBC規(guī)范的信息如錯誤消息返回給驅(qū)動程序提供符合JDBC規(guī)范的事務(wù)管理程序關(guān)閉DBMS和J2EE組件之間的連接類型:JDBC驅(qū)動程序規(guī)范把JDBC驅(qū)動程序分為4組:

(1)JDBC-to-ODBC驅(qū)動程序JDBC-to-ODBC驅(qū)動程序從符合JDBC規(guī)范的

J2EE組件接收消息,這些消息被JDBC-to-ODBC驅(qū)動程序轉(zhuǎn)換為ODBC消息格式,然后又被轉(zhuǎn)換為ODBC消息格式,然后再被轉(zhuǎn)換為

DBMS可以理解的消息格式。不要在關(guān)鍵任務(wù)應(yīng)用程序中使用該類型驅(qū)動程序,額外的轉(zhuǎn)換可能會給應(yīng)用程序的性能帶來負面影響。(2)JAVA/本地代碼驅(qū)動程序JAVA/本地代碼驅(qū)動程序使用JAVA類來產(chǎn)生平臺相關(guān)的代碼,也就是只能被一個特定的

DBMS所理解的代碼。DBMS制造商既提供

JAVA/本地代碼驅(qū)動程序也提供API類,這樣

J2EE組件可以產(chǎn)生特定平臺的代碼。使用JAVA/本地代碼驅(qū)動程序的明顯缺點就是代碼失去了一定的可移植性。(3)第三類JDBC驅(qū)動程序第三類JDBC驅(qū)動程序也稱做是JAVA協(xié)議,是最常用的JDBC驅(qū)動程序。第三類JDBC驅(qū)動程序把SQL查詢轉(zhuǎn)換為JDBC格式的語句,

JDBC格式的語句轉(zhuǎn)換為DBMS所需要的格式。(4)第四類JDBC驅(qū)動程序第四類JDBC驅(qū)動程序也稱做第四類數(shù)據(jù)庫協(xié)

議。這種驅(qū)動程序類似于第三類JDBC驅(qū)動程序,只不過在第四類驅(qū)動程序中,SQL查詢被轉(zhuǎn)換

為DBMS所需的格式而不必轉(zhuǎn)換為JDBC格式。這種方式是將SQL查詢傳遞給DBMS最快的方式。3.2

JDBC包JDBC括API包含在兩個包里:java.sql,包含JDBC

API的核心JAVA數(shù)據(jù)對象:為DBMS連接和存儲在DBMS里的數(shù)據(jù)進行

交互而提供的基本JAVA數(shù)據(jù)對象。java.sql是J2SE的一部分。javax.sql,擴展了java.sql,是J2EE的一部分,除其他高級JDBC特性外,java.sql還包含那些與JNDI進行交互的JAVA數(shù)據(jù)對象以及管理連接池的JAVA數(shù)據(jù)對象。3.3

JDBC處理過程各種J2EE組件與DBMS的交互過程是類似的,可以分為5個步驟:載入JDBC驅(qū)動程序連接到DBMS創(chuàng)建并執(zhí)行一個語句處理DBMS返回的數(shù)據(jù)終止與DBMS的連接(1)載入JDBC驅(qū)動程序在J2EE組件可以連接到DBMS之前必須先加載JDBC驅(qū)動程序。載入JDBC驅(qū)動程序的使用Class.forName()方法,該方法的參數(shù)為驅(qū)動程序的名稱,如:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);(2)連接到DBMS載入驅(qū)動程序后,J2EE組件需要調(diào)用

DriverManager..getConnection()方法連接到

DBMS。該方法的參數(shù)是一個數(shù)據(jù)庫的URL,如果

DBMS需要的話,參數(shù)還要包括用戶ID與口令。該方法的返回結(jié)果是一個用于整個處理過程的

Connection接口,程序通過該接口引用數(shù)據(jù)庫。示例—連接到DBMSString

url=“jdbc:odbc:CustomerInformation”;String

userID

=

“l(fā)pf”;String

pwd

=

“whut”;private

Connection

Db;try{Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);Db

=DriverManager.getConnection(url,userID,pwd);}(3)創(chuàng)建并執(zhí)行SQL語句在載入驅(qū)動程序并成功與一個特定的DBMS管理的數(shù)據(jù)庫連接之后,下一步是要發(fā)送一個

SQL語句給DBMS處理。首先調(diào)用Connection.createStatement()方法創(chuàng)建一個Statement即語句對象,然后調(diào)用該對象的查詢方法從DBMS返回一個包含響應(yīng)結(jié)果的

ResultSet即結(jié)果集對象。示例—創(chuàng)建并執(zhí)行SQL語句

Statement

DataRequest;ResultSet

Results;try{String

query

=

“select

*

from

Customers”;DataRequest

=

Db.createStatement();Results

=

DataRequest.executeQuery(query);DataRequest.Close();}(4)處理從DBMS返回的數(shù)據(jù)從DBMS查詢處理的結(jié)果賦給java.sql.ResultSet對象。通過調(diào)用ResultSet的相關(guān)方法來操作數(shù)據(jù)。例:String

FisrtName;String

LastName;String

PrintStr;while(Results.next()){FirstName

=Results.getString(“FirstName”);LastName

=Results.getString(“LastName”);PrintStr

=

FirstName

+

+

LastName;System.out.println(PrintStr);}(5)終止與DBMS的連接J2EE組件完成對DBMS的訪問后,需要通過使用Connection的close()方法來終止與DBMS的連接。若在與DBMS結(jié)束連接時遇到問題,

close()方法會拋出一個異常。例:Db.close();3.4數(shù)據(jù)庫連接J2EE組件通過JDBC驅(qū)動程序連接DBMS,所以在連接DBMS數(shù)據(jù)庫之前需要加載JDBC驅(qū)動程序并在DriverManager中注冊。載入和注冊JDBC驅(qū)動程序的目的是把JDBC驅(qū)動程序加載到JVM中。JDBC驅(qū)動程序被載入的同時自動注冊DriverManager,所以可以被

JVM訪問并被J2EE組件使用。例:

try{Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);}catch(ClassNotFoundException

error){System.err.println(“Unable

to

load

theJDBC/ODBC

bridge.”

+

error.getMessage());System.exit(1);}(1)連接:在JDBC驅(qū)動程序成功加載和注冊后,J2EE組件需要連接數(shù)據(jù)庫。JDBC要連接的數(shù)據(jù)源使用URL格式來定義。

URL包括三個部分,即:jdbc指出JDC協(xié)議是用來讀取URL的<subprotocol>JDBC驅(qū)動程序的名字<subname>數(shù)據(jù)庫的名字與數(shù)據(jù)庫的連接通過使用DriverManager的getConnction()方法,該方法有3種形式(2次重載)。getConnection(String

url);getConnection(String

url,

String

user,

Stringpassword);getconnection(String

url,

Properties

props);例一:String

url

=

“jdbc:odbc:CustomerInformation”;Connection

Db;try{Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);Db

=

DriverManager.getConnection(url);}catch(ClassNotFoundException

error){System.err.println(“Unable

to

load

the

JDBC/ODBC

bridge.”

+error.getMessage());System.exit(1);}catch(SqlException

error){System.err.println(“Unable

to

connect

to

the

database.”

+error.getMessage());System.exit(2);}例二:String

url

=

“jdbc:odbc:CustomerInformation”;String

userID

=

“l(fā)pf”;String

password

=

“whut”;Connection

Db;try{Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);Db

=

DriverManager.getConnection(url,userID,password);}catch(ClassNotFoundException

error){System.err.println(“Unable

to

load

the

JDBC/ODBC

bridge.”

+error.getMessage());System.exit(1);}catch(SqlException

error){System.err.println(“Unable

to

connect

to

the

database.”

+error.getMessage());System.exit(2);}例三://用來訪問數(shù)據(jù)庫的屬性存儲在一個文本文件里String

url=“jdbc:odbc:CustomerInformation”;Connection

Db;Properties

props

=

new

Properties();try{FileInputStream

propFileStream

=

newfileInputStream(“DBProps.txt”);props.load(propFileStream);}catch(IOException

error){System.err.println(“Error

loading

propFile”

+error.getMessage());Sysyem.exit(1);}try{Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);Db

=

DriverManager.getConnection(url,props);}catch(ClassNotFoundException

error){System.err.println(“Unable

to

load

the

JDBC/ODBC

bridge.”

+error.getMessage());System.exit(2);}catch(SqlException

error){System.err.println(“Unable

to

connect

to

the

database.”

+error.getMessage());System.exit(3);}(2)超時:在實際網(wǎng)絡(luò)系統(tǒng)環(huán)境中,DBMS可能不會很快響應(yīng),數(shù)據(jù)庫連接可能不可用,為避免無限制或過長等待一個延遲的DBMS響應(yīng),J2EE組件

可以設(shè)置一個超時時間段,在這個時間段之后

DriverManager將終止連接數(shù)據(jù)庫的嘗試。方法:public

static

voidDriverManger.setLoginTimeout(int

seconds);(3)連接池:連接池是一個數(shù)據(jù)庫連接的集合,只打開一次并載入內(nèi)存,這些連接可以被重復(fù)使用而不必重新連接。從連接池訪問一個連接的方法:/*

InitialContext

is

a

class

of

starting

context

forperforming

naming

operations.*/Context

ctext

=

new

InitialContext();DataSource

pool

=(DataSource)ctext.lookup(“java:comp/env/jdbc/pool”);Conection

Db

=

pool.getConnection();Db.Close();//這里關(guān)閉的是邏輯連接而不是物理連接3.5

Statement對象一旦打開數(shù)據(jù)庫連接之后,J2EE組件創(chuàng)建并發(fā)送查詢來訪問包含在數(shù)據(jù)庫里的數(shù)據(jù)??梢允褂萌N類型的Statement對象中的一種來執(zhí)行查詢:Statement:用來立即執(zhí)行一個查詢。

PreparedStatement:用來執(zhí)行編譯過的查詢。

CallableStatement:用來執(zhí)行存儲過程。(1)Statement對象:Statement對象用于J2EE組件需要立即執(zhí)行一個查詢而不是首先編譯這個查詢。Statement對象包含executeQuery()方法,要執(zhí)行的SQL查詢作為一個參數(shù)傳遞給它,然后這個查詢傳送給DBMS處理。該方法返回

ResultSet對象。在可能存在多個返回結(jié)果時,使用Statemet對象的execute()方法。若要進行修改和刪除,使用Statement對象的

executeUpdate()方法。例一—executeQuery:try{String

query

=

“select

*

from

Customers”;Statement

DataRequest

=

Db.CreateStatement();ResultSet

Results

=DataRequest.executeQuery(query);DataRequest.close();}catch(SQLException

error){Sysyem.exit(1);}例二—executeUpdate:try{String

query

=

“update

Customers

set

paid

=

‘Y’”;Statement

DataRequest

=

Db.CreateStatement();ResultSet

Results

=DataRequest.executeUpdate(query);DataRequest.close();}catch(SQLException

error){Sysyem.exit(1);}(2)PreparedStatement對象:一個查詢必須在DBMS處理之前被編譯,編譯動作發(fā)生在Statement對象的執(zhí)行方法被調(diào)用之后。如果一個查詢被相同的J2EE組件實例在同一個會話中執(zhí)行多次的話,編譯處理可能會成為一個昂貴的系統(tǒng)開銷。使用PreparedStatement對象,可以預(yù)編譯一個SQL查詢并執(zhí)行它。在查詢被編譯后,一個問號會作為一個值的占位符插入到查詢中去。在執(zhí)行查詢前可以通過調(diào)用

PreparedStatement的Setxxx()方法設(shè)置這個值

(這里xxx代表數(shù)據(jù)類型,例如若為字符串則方法為SetString()),其參數(shù)有兩個,第一個參數(shù)是整數(shù),標(biāo)識問號占位符的位置,第二個參數(shù)是用來替換問號占位符的值。然后調(diào)用

PreparedStatement的executeQuery()方法。預(yù)編譯由DBMS執(zhí)行,稱為“晚期綁定”。當(dāng)

DBMS接收到這個請求時,DBMS試圖將該查詢

與編譯過后查詢相匹配。如果找到了匹配的查詢,那么用setxxx()方法傳遞給查詢的參數(shù)將被綁定并執(zhí)行查詢。如果沒有找到,那么查詢將被編譯,并由DBMS保留以備后用。例:

try{String

query

=

“select

*

from

Customers

whereCustNumber

=

?”;PreparedStatement

pstatement

=Db.preparedStatement(query);pstatement.setString(1,”123”);ResultSet

Results

=

pstatement.executeQuery();pstatement.close();}catch(SQLException

error){Sysyem.exit(1);}(3)CallableStatement對象:CallableStatement對象用來從J2EE對象中調(diào)用一個存儲過程。在調(diào)用一個存儲過程時,CallableStatement對象使用三種類型的參數(shù):IN、OUT和INOUT。IN參數(shù)包含傳遞給存儲過程的任何數(shù)據(jù),其值通過setxxx()方法來賦值。OUT參數(shù)包含由存儲過程返回的值。OUT參數(shù)必須使用registerOutParameter()方法注冊,然后J2EE組件使用getxxx()方法檢索它的值。INOUT參數(shù)是一個既可以用來傳遞信息給存儲過程,也可以用來從存儲過程中檢索信息的參數(shù)。例:

try{String

query

=

“{CALL

LastOrderNumber

(?)}”;CallableStatement

cstatement

=Db.prepareCall(query);cstatement.registerOutParameter(1,Types.Varchar);cstatement.execute();String

lastOrderNumber

=

cstatement.getString(1);cstatement.close();}catch(SQLException

error){Sysyem.exit(1);}說明:存儲過程有一個參數(shù),用一個問號占位代表。

Connection的prepareCall()方法返回一個CallableStatement對象。因為存儲過程使用一個OUT參數(shù),這個參數(shù)

必須使用CallableStatement對象的

registerOutParameter()方法進行注冊。該方法有兩個參數(shù),第一個是整數(shù),表示參數(shù)的編號,第二個表示存儲過程返回值的數(shù)據(jù)類型。調(diào)用CallableStatement對象的execute()方法執(zhí)行查詢。存儲過程執(zhí)行后,調(diào)用getString()方法返回存儲過程的指定參數(shù)值。3.6結(jié)果集Result對象包含一些方法來從結(jié)果集復(fù)制數(shù)據(jù)

到一個Java集合對象或變量中,以便進一步處理。

Result對象中的數(shù)據(jù)在邏輯上被組織成一個虛擬的包含行和列的表。Result對象還包含元數(shù)據(jù),如列名、列的大小以及列的數(shù)據(jù)類型。結(jié)果集使用一個游標(biāo)來指向虛擬表中的行。

J2EE組件必須移動游標(biāo)到各行,然后使用

ResultSet對象的其它方法來與存儲在那一行中的數(shù)據(jù)進行交互。當(dāng)executeQuery()方法返回一個結(jié)果集時,游標(biāo)指向結(jié)果集中的第一行之前。此時調(diào)用next()方法來使游標(biāo)指向結(jié)果集的第一行。如果行中包含數(shù)據(jù),next()方法返回true,否則返回false。一旦游標(biāo)指向一行數(shù)據(jù),可以使用getxxx()方法來從這一行復(fù)制數(shù)據(jù)到一個集合、對象或變

量中。該方法要求一個參數(shù),表示列號或列名。(1)讀取結(jié)果集:String

fName;String

lName;try{String

query

=

“select

FirstName,LastName

from

Customers”;Statement

da

=

Db.CreateStatement();ResultSet

rs

=

da.executeQuery(query);while(rs.next()){fName

=

rs.getString(1);lName

=

rs.getString(2);//put

other

code

here

to

handle

fName

and

lName}da.Close();}catch(SQLException

error){//put

exception

handling

code

here}(2)更新結(jié)果集:包含在結(jié)果集中的行可以被更新,就象表中的行可以被更新一樣。通過給Connection對象的createStatement()方法傳遞參數(shù)

CONCUR_UPDATABLE,更新就變?yōu)榭赡埽幌喾纯梢越ocreateStatement()方法傳遞參數(shù)CONCUR_READ_ONLY以阻止結(jié)果集被更新。默認(rèn)為CONCUR_READ_ONLY。(2)更新結(jié)果集—更新:首先調(diào)用updatexxx()方法來改變結(jié)果集當(dāng)前行中相關(guān)列的值。該方法要求兩個參數(shù),第一個是被更新結(jié)果集的列名或列號,第二個參數(shù)是用來替換的值。(updateNull將一個列的值用

NULL值來替換。updateNull方法要求一個參數(shù),即列號。注:該方法不接受列名作為參數(shù)。)然后調(diào)用updateRow()方法來使該行的改變生效。注:這個改變只出現(xiàn)在結(jié)果集中,表中相關(guān)行的值保持不變,直到運行一個更新查詢。例:將姓”Smity”修改為”Smith”String

lName;try{String

query

=

“select

FirstName,LastName

from

Customers”;Statement

da

=Db.CreateStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_UPDATABLE);ResultSet

rs

=

da.executeQuery(query);while(rs.next()){lName

=

rs.getString(“LastName”);if(lNpareTo(“Smity”)

==

0){rs.updateString(“LastName”,

“Smith”);rs.updateRow();}}da.Close();}catch(SQLException

error){//put

exception

handling

code

here}(2)更新結(jié)果集—刪除:調(diào)用deleteRow()方法來刪除結(jié)果集中的行。例:刪除所有姓為”Smith”的行String

lName;try{String

query

=

“select

FirstName,LastName

from

Customers”;Statement

da

=Db.CreateStatement(ResultSet.CONCUR_UPDATABLE);ResultSet

rs

=

da.executeQuery(query);while(rs.next()){lName

=

rs.getString(“LastName”);if(lNpareTo(“Smith”)

==

0){rs.deleteRow();}}da.Close();}catch(SQLException

error){//put

exception

handling

code

here}(2)更新結(jié)果集—插入:首先調(diào)用updatexxx()方法來指定放入結(jié)果集列里的列的值。然后調(diào)用insertRow(),使得插入到結(jié)果集中的一個新行擁有updatexxx()方法中參數(shù)所反映的值。注:這個操作也更新了后臺的數(shù)據(jù)庫。例:插入一行try{String

query

=

“select

FirstName,LastName

from

Customers”;Statement

da

=Db.CreateStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_UPDATABLE);ResultSet

rs

=

da.executeQuery(query);if(!rs.next()){//add

some

tip

message

hereSystem.Exit(4);}rs.updateString(1,“Tom”);rs.updateString(2,“Smith”);rs.insertRow();da.Close();}catch(SQLException

error){//put

exception

handling

code

here}(3)可滾動結(jié)果集:在JDBC2.1API以前,游標(biāo)只能在Result對象中向后移動,現(xiàn)在游標(biāo)可以支持向前移動,以及指向一個特定行。方法:next()向后移動一行first()移動到第一行l(wèi)ast()移動到最后一行previous()向前移動一行absolute()移動到指定行號的行relative()相對當(dāng)前位置向后(正數(shù))或向前移動(負數(shù))多少行g(shù)etRow()返回當(dāng)前行的行號通過給createStatement()方法傳遞下面三個常數(shù)之一來創(chuàng)建可滾動結(jié)果集:TYPE_FORWARD_ONLY游標(biāo)只能向后移動,默認(rèn)設(shè)置TYPE_SCROLL_INSENSITIVE結(jié)果集對另一J2EE組件對表中的數(shù)據(jù)修改不敏感。TYPE_SCROLL_SENSITIVE結(jié)果集對另一J2EE組件對表中的數(shù)據(jù)修改敏感。在創(chuàng)建滾動結(jié)果集之前最好判斷JDBC驅(qū)動程序是否支持其中的某些或全部特征。例:游標(biāo)的移動try{String

query

=

“select

FirstName,LastName

from

Customers”;Statement

da

=Db.CreateStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);ResultSet

rs

=

da.executeQuery(query);if(!rs.next()){//add

some

tip

message

hereSystem.Exit(4);}rs.first();rs.last();rs.previous();rs.absolute(10);rs.relative(4);rs.relative(-4);da.Close();}catch(SQLException

error){//put

exception

handling

code

here}例:判斷JDBC驅(qū)動程序?qū)L動特性的支持DataBaseMetaData

meta

=

Db.getMetaData();boolean

forward

=meta.supportsResultsSetType(ResultSet.TYPE_FORWARD_ONLY);boolean

insensitive

=meta.supportsResultsSetType(ResultSet.TYPE_SCROLL_INSENSITIVE);boolean

sensitive

=meta.supportsResultsSetType(ResultSet.TYPE_SCROLL_SENSITIVE);3.7事務(wù)一個事務(wù)包括幾個任務(wù)即一系列的SQL語句的執(zhí)行,

每個語句必須成功完成事務(wù)才能完成;如果一個語句執(zhí)行失敗,事務(wù)中在此之前已成功執(zhí)行的語句必須被圓滾。事務(wù)的提交通過調(diào)用commit()方法,在調(diào)用該方法之前執(zhí)行的SQL語句都可以被回滾。一旦commit()方法被調(diào)用,該事務(wù)中執(zhí)行的SQL語句不能再圓滾。commit()方法必須被調(diào)用,不管SQL語句是否為事務(wù)的一部分,DBMS有一個AutoCommit屬性,其默認(rèn)值為true,每執(zhí)行一條語句commit()方法被自動調(diào)用。這意味著J2EE組件處理事務(wù)時需要將該屬性設(shè)為false,事務(wù)完成后,再將該屬性設(shè)置為true。例:執(zhí)行一個數(shù)據(jù)庫事務(wù)try{Db.SetAutoCommit(false);String

query1

=

“UPDATE

Customers

SET

Street=‘122

LuoshiRoad’

WHERE

FirstName

=

‘Bob’”;String

query2

=

“UPDATE

Customers

SET

Street=‘122

LuoshiRoad’

WHERE

FirstName

=

‘Tom’”;Statement

da

=

Db.CreateStatement();da.executeUpdate(query1);da.executeUpdate(query2);Db.Commit(); da.Close();

Db.Close();}catch(SQLException

error){

if(Db

!=

null)

Db.rollback();}例:保存點(用于指定事務(wù)內(nèi)回滾的停止點)SavePoint

sp1

=

null;try{Db.SetAutoCommit(false);String

query1=“…”;//偽代碼String

query2=“…”;//偽代碼Statement

da

=

Db.CreateStatement();da.executeUpdate(query1);sp1

=

Db.setSavePoint(“sp1”);da.executeUpdate(query2);Db.Commit();

da.Close();Db.releaseSavePoint(sp1);

Db.Close();}catch(SQLException

error){if(Db

!=

null)

Db.rollback(sp1);}例:批處理Statement

da

=

null;try{Db.SetAutoCom

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論