《Java語言程序設計》課件第11章_第1頁
《Java語言程序設計》課件第11章_第2頁
《Java語言程序設計》課件第11章_第3頁
《Java語言程序設計》課件第11章_第4頁
《Java語言程序設計》課件第11章_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

11.1JDBC數(shù)據(jù)庫編程

11.2JavaDB嵌入數(shù)據(jù)庫

11.3小結(jié)

11.4習題

Java數(shù)據(jù)庫類層次圖見圖11-1。

Java對數(shù)據(jù)庫的操作全部集成在java.sql包中,java.sql還包含連接、狀態(tài)集、結(jié)果集、數(shù)據(jù)和異常處理幾個子類,同時還有一個javax.sql的擴展包,包含三個子類,即DataSource、RowSet和Event,以實現(xiàn)和Microsoft的ADO相類似的數(shù)據(jù)庫處理。11.1JDBC數(shù)據(jù)庫編程圖11-1Java數(shù)據(jù)庫類層次圖11.1.1JDBC基礎

1.ODBC

在了解JDBC之前,我們先來了解一下ODBC。ODBC即OpenDatabaseConnectivity,是Microsoft為了實現(xiàn)各種異構(gòu)數(shù)據(jù)庫的連接而推出的一個開放的數(shù)據(jù)庫連接標準。ODBC一般提供以應用編程接口API來實現(xiàn)數(shù)據(jù)庫的編程。ODBC包含四個部分,即應用程序Application、驅(qū)動程序管理器DriverManager、驅(qū)動程序Driver和數(shù)據(jù)源DataSource,它們分別完成不同的功能。其中,Application主要完成程序?qū)?shù)據(jù)庫的各種操作,提交SQL語句,并返回結(jié)果集;DriverManager主要給Application裝載所對應的驅(qū)動程序;Driver負責與具體的數(shù)據(jù)庫交互,實現(xiàn)程序?qū)?shù)據(jù)庫的各種操作;DataSource主要包括與數(shù)據(jù)庫相關(guān)聯(lián)的數(shù)據(jù)庫管理系統(tǒng)DBMS以及網(wǎng)絡平臺。

2.?JDBC的概念

JDBC(JavaDatabaseConnectivity)是Java數(shù)據(jù)庫的連接標準,是一個獨立于數(shù)據(jù)庫管理系統(tǒng)的、通用的SQL數(shù)據(jù)庫存取和操作的公共接口,它定義了用來訪問數(shù)據(jù)庫的標準Java類庫,使用該類庫可以以一種標準的方法方便地訪問數(shù)據(jù)庫資源。

JDBC屏蔽了對數(shù)據(jù)庫訪問的一些細節(jié),使得應用程序編程人員可以使用JDBC連接來訪問任何一種提供了JDBC驅(qū)動的數(shù)據(jù)庫系統(tǒng),而編程人員無需了解各種數(shù)據(jù)庫的細節(jié),從而簡化了軟件的研發(fā)過程。

JDBC的結(jié)構(gòu)與ODBC類似,包含兩個層次:面向應用的API和面向數(shù)據(jù)庫的API。面向應用的API提供數(shù)據(jù)庫的接口,主要供應用程序編程人員使用,完成連接數(shù)據(jù)庫、操作數(shù)據(jù)庫和得到結(jié)果集。面向數(shù)據(jù)庫的API,即JavaDriverAPI,主要是給數(shù)據(jù)庫廠商開發(fā)數(shù)據(jù)庫驅(qū)動使用。與JDBC四個部分相比,JDBC少了數(shù)據(jù)源這個部分,而是直接在應用程序中加載驅(qū)動程序來連接數(shù)據(jù)庫。JDBC的結(jié)構(gòu)如圖11-2所示。圖11-2JDBC結(jié)構(gòu)圖

3.?JDBC術(shù)語

●?DriverManager(java.sql.DriverManager):裝載驅(qū)動程序,管理應用程序與驅(qū)動程序之間的連接。

●?Driver(由驅(qū)動程序開發(fā)商提供):將應用程序的API請求轉(zhuǎn)換為特定的數(shù)據(jù)庫請求。

●?Connection(java.sql.Connection):將應用程序連接到特定的數(shù)據(jù)庫。

●?Statement(java.sql.Statement):在一個給定的連接中,用于執(zhí)行一個靜態(tài)的數(shù)據(jù)庫SQL語句。

●?ResultSet(java.sql.ResultSet):SQL語句執(zhí)行完后,返回數(shù)據(jù)結(jié)果集(包括行、列)。

●?Metadata(java.sql.DatabaseMetadata;java.sql.ResultSetMetadata):元數(shù)據(jù)。11.1.2驅(qū)動程序

JDBC供支持四種類型的驅(qū)動程序:Type1——JDBC-ODBC驅(qū)動、Type2——本地API部分Java驅(qū)動、Type3——JDBC-NET純Java驅(qū)動和Type4——本地協(xié)議純Java驅(qū)動。

JDBC-ODBC驅(qū)動:由SUN公司在J2SDK中直接提供sun.jdbc.odbc.JdbcOdbcDriver的驅(qū)動,應用程序通過JDBC-ODBC訪問ODBC,ODBC通過自己的驅(qū)動程序再去與數(shù)據(jù)庫交互。這種方式必須先配置ODBC,且數(shù)據(jù)庫能夠提供ODBC的驅(qū)動程序,一般大多應用在MicrosoftWindows平臺上的一些應用程序中。本地API部分Java驅(qū)動:由本地API驅(qū)動把JDBC的命令轉(zhuǎn)換為特定數(shù)據(jù)庫系統(tǒng)的本地庫的方式。與Type1類似,須先安裝特定庫的非Java的方法,如DLL文件。

JDBC-NET純Java驅(qū)動:首先將JDBC的操作數(shù)據(jù)庫的命令轉(zhuǎn)換為與數(shù)據(jù)庫無關(guān)的網(wǎng)絡協(xié)議,并發(fā)送給中間服務器,然后中間服務器再將與數(shù)據(jù)庫系統(tǒng)無關(guān)的網(wǎng)絡協(xié)議轉(zhuǎn)換為特定數(shù)據(jù)庫系統(tǒng)的協(xié)議,并發(fā)送給數(shù)據(jù)庫系統(tǒng);數(shù)據(jù)庫系統(tǒng)返回的結(jié)果先發(fā)送給中間服務器,再由中間服務器傳遞給應用程序。

本地協(xié)議純JAVA驅(qū)動:這是一種純Java的程序的驅(qū)動,它直接將JDBC的命令轉(zhuǎn)換為數(shù)據(jù)庫本地協(xié)議。其優(yōu)點是沒有中間層,一般用于提高訪問數(shù)據(jù)庫性能時的環(huán)境。

上述四種驅(qū)動的結(jié)構(gòu)如圖11-3所示。圖11-3JDBC四種驅(qū)動方式11.1.3JDBC編程

要實現(xiàn)JDBC編程,必須按照JDBC的執(zhí)行過程來實現(xiàn)對數(shù)據(jù)庫的訪問。首先我們來了解JDBC的執(zhí)行過程。

1.?JDBC執(zhí)行過程

JDBC執(zhí)行時首先加載所需要的類(java.sql包),然后加載JDBC驅(qū)動程序,識別數(shù)據(jù)源后創(chuàng)建連接對象和結(jié)果集對象,然后以結(jié)果集對象Statement運行查詢,最后將查詢結(jié)果返回到結(jié)果集ResultSet,運行完后關(guān)閉結(jié)果集,并關(guān)閉狀態(tài)集和連接對象。JDBC執(zhí)行過程如圖11-4所示。圖11-4JDBC執(zhí)行過程完成JDBC主要有以下四個步驟:

(1)加載驅(qū)動程序,以語句Class.forName(“driverName”)來實現(xiàn)。

(2)打開數(shù)據(jù)庫連接,以語句DriverManager.getConnection(“jdbc:xxx:datasource”)來

實現(xiàn)。

(3)創(chuàng)建狀態(tài)集并執(zhí)行SQL語句,以語句stmt?=?con.createStatement()和stmt.executeQuery("Select*fromanyTable")來實現(xiàn)。

(4)查看結(jié)果集,以語句while(rs.next()){field1name=rs.getString(“field1name”);

fiield2name=rs.getInt(“field2name”);…}來實現(xiàn)。

在下面示例中,我們也是按照這個步驟來完成JDBC對數(shù)據(jù)庫的訪問的。

2.加載驅(qū)動

在JDBC編程時,通常有三種方式來加載驅(qū)動程序:

●利用System類的靜態(tài)方法setProperty(),如System.setProperty(“jdbc.drivers”,

“sun.jdbc.odbc.JdbcOdbcDriver”)。

●利用Class類的靜態(tài)方法forName(),如Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”),

Class.forName(“oracle.jdbc.driver.OracleDriver”)。

●直接創(chuàng)建一個驅(qū)動程序?qū)ο?,如newsun.jdbc.odbc.JdbcOdbcDriver()。

3.連接對象

創(chuàng)建連接對象時,應用DriverManager類的靜態(tài)方法getConnection()來獲得特定數(shù)據(jù)庫的實例對象。如Connectionconn=DriverManager.getConnection(source)或Connectionconn=DriverManager.getConnection(source,user,pass),其中參數(shù)user、pass和source都是String類型的字符串,user為數(shù)據(jù)庫的連接用戶名,pass為數(shù)據(jù)庫連接用戶的口令,source隨連接數(shù)據(jù)庫的不同而不同,一般語法為

jdbc:driverType:dataSource前面jdbc固定,后面分別為驅(qū)動類型和數(shù)據(jù)源。如采用JDBC-ODBC橋時,driverType為“ODBC”,dataSource為“jdbc:odbc:DSNName”(DSNName為ODBC的數(shù)據(jù)源名稱)。驅(qū)動類型不同,driverType和dataSource都會隨之變化。

連接對象應用getAutoCommit()和setAutoCommit()方法可以獲取事務處理自動提交的標志和設置事務處理自動提交標記;應用commit()方法可以將事務過程提交;應用rollback()方法可以將提交的事務實施回滾;應用getMetaData()方法可以創(chuàng)建一個DatabaseMetadata對象;通過DatabaseMetadata的getDatabaseProductName()方法、getDatabaseProductVersion()方法和getDriverName()方法可以獲取數(shù)據(jù)庫廠商、版本及每個數(shù)據(jù)表的名稱和數(shù)量等信息。

4.狀態(tài)集

JDBC通過Statement狀態(tài)集的exceute來執(zhí)行SQL語句,因此在執(zhí)行SQL語句前須創(chuàng)建狀態(tài)集對象Statement,一般應用Connetcion對象的createStatement()方法來創(chuàng)建一個Statement實例對象,如state=conn.CreatStatement()創(chuàng)建了一個對象名為state的狀態(tài)集對象。

Statement對象的方法有:excuteBatch()方法用于執(zhí)行數(shù)據(jù)庫的批處理命令;

executeUpdate(Stringsql)、executInsert(Stringsql)和executeDelete(Stringsql)方法用于返回一個整形值,表明執(zhí)行了修改、插入或刪除記錄的條數(shù)。

Statement對象還可由execute(Stringsql)來直接執(zhí)行SQL語句。

JDBC中有三種狀態(tài)集,即Statement、PreparedStatement和CallableStatement。Statement常用于執(zhí)行比較簡單的操作;PreparedStatement用于執(zhí)行參數(shù)變化的操作;CallableStatement用于執(zhí)行定義在數(shù)據(jù)庫當中的存儲過程,并獲取執(zhí)行結(jié)果。

PreparedStatement類繼承了Statement類,在它的對象中可以用“?”代替多個待定義參數(shù),這些參數(shù)將在提交數(shù)據(jù)庫系統(tǒng)執(zhí)行之前,由PreparedStatement對象的setXXX方法進行設置,如:

PreparedStatementpstmt=con.PreparedStatement;

(“Select*fromtablewherename=?AndID=?”);

pstmt.setString(“John”);

pstmt.setInt(1234556);

PreparedStatement執(zhí)行速度要快于Statement。

CallableStatement類也是繼承Statement類,用于執(zhí)行數(shù)據(jù)庫系統(tǒng)當中定義的存儲過程,一般調(diào)用的方式如下:

{result=CallProcedureName[(?,?,…)]}

創(chuàng)建CallableStatement對象可采用如下方法:

CallableStatementcstmt=con.prepareCall(“{call

procedure(?,?,?)}")

cstmt=setFloat(1,123.456f);

cstmt=registerOutparameter(2,java.sql.Types.DECIMAL);

cstmt.setInt(3,500);

cstmt.registerOutParameter(3,java.sql.Types.INTEGER);

5.結(jié)果集

方法ResultSetexecuteQuery(Stringsql)執(zhí)行一個SQL的查詢語句后,將結(jié)果返回給一個ResultSet的結(jié)果集對象。通過結(jié)果集對象的一些方法,我們就可以獲得查詢結(jié)果。ResultSet對象一般定位于第一個結(jié)果記錄,通過rs對象的next()、previous()、afterLast()、beforeFirst()方法可以實現(xiàn)記錄的向后、向前移動一個位置,向記錄集末尾和頭位置移動;應用absolute()方法可以獲取當前光標位置;deleteRow、insertRow可以執(zhí)行刪除記錄集中的行和在記錄集中插入的行;應用getXXX()和updateXXX()方法可以獲取或更新與字段類型匹配的字段的值。

常用結(jié)果集的獲取方法如表11-1所示。表11-1結(jié)果集常用的獲取方法另外,通過ResultSetMetadata可以獲取查詢結(jié)果的元數(shù)據(jù)的一些信息。

如ResultSetMetadatarsm=rs.getMetadata(),則將一些元數(shù)據(jù)的信息返回至rsm對象中,通過ResultSetMetadata的getColumnCount()、getColumnName(inti)、getColumnType(inti)和getTableName()方法可以知道字段數(shù)量、字段名稱、字段類型和表名。11.1.4JDBC示例

下面我們以訪問“學生基本信息表”為例來說明JDBC如何訪問數(shù)據(jù)庫。

例11-1在JDBC-ODBC驅(qū)動的方式下,Access的驅(qū)動程序由ODBC提供,訪問的數(shù)據(jù)源DSN為當前的StudentInfo.mdb的Access數(shù)據(jù)庫文件,也可以在Windows系統(tǒng)的“控制面板/管理工具/數(shù)據(jù)源ODBC”中配置DSN數(shù)據(jù)源。例11-2以SQLServer2000為例說明JDBC對數(shù)據(jù)庫的訪問,加載的驅(qū)動為“com.microsoft.jdbc.sqlserver.SQLServerDriver”,由第三方即Microsoft公司提供。需要說明的是,此驅(qū)動在JDK并沒有默認安裝,需要在網(wǎng)絡上下載并安裝。

SQLServer2000DriverforJDBC下載可在Microsoft下載站中查找:

/downloads/detaills.aspx?FamilyID=0728B11-0502-461A-B138-2AA54BFDC03A&dsplaylang=en下載后需解壓縮三個文件:mssqlserver.jar、msutil.jar和msbase.jar,將這三個文件拷貝至Java安裝目錄%JAVA_HOME%\lib的目錄下,然后設置classpath,使classpath指向這三個文件,即運行setclasspath=.;%JAVA_HOME%\lib\mssqlserver.jar;%JAVA_HOME%\lib\

msutils.jar;%JAVA_HOME%\lib\msbase.jar;,或在“環(huán)境變量”中設置classpath的值。

需要注意的是,有時因為SQLServer的1433端口未開放,所以執(zhí)行程序會出現(xiàn)異常,建議安裝SQLServer的SP3的補丁包。

例11-1和例11-2運行的結(jié)果相同,其結(jié)果如圖11-5所示。圖11-5JDBC訪問數(shù)據(jù)庫【例11-1】以JDBC-ODBC驅(qū)動的方式訪問數(shù)據(jù)庫。

importjava.sql.*;

importjavax.swing.JOptionPane;

importjava.io.*;

publicclassJDBCAccess

{publicstaticvoidmain(Stringargs[])

{

try{ Stringstrurl="jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb)};DBQ=StudentInfo.mdb";

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

Connectionconn=DriverManager.getConnection(strurl);

Statementstmt=conn.createStatement();

ResultSetrs=stmt.executeQuery("select*fromStudentInfoorderbyid");

while(rs.next())

{JOptionPane.showMessageDialog(null,"學號:"+rs.getString("ID")+

"姓名:"+rs.getString("name")+"年齡:"+

rs.getString("age")+"\n性別:"+rs.getString("sex")+

"系部:"+rs.getString("department")+

"班級:"+rs.getString("class"),"記錄信息",

JOptionPane.INFORMATION_MESSAGE);

}

}

catch(Exceptione){System.out.println(e);}

}

}【例11-2】以SQLServer2000為例說明JDBC對數(shù)據(jù)庫的訪問。

importjava.sql.*;

importjavax.swing.JOptionPane;

importjava.io.*;

publicclassJDBCAccess

{

publicstaticvoidmain(Stringargs[])

{

try

{ Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();

Stringurl="jdbc:microsoft:sqlserver://SrvName:1433;DatabaseName=StudentInfo";

Connectionconn=DriverManager.getConnection(url,"sa","");

Statementstmt=conn.createStatement();

ResultSetrs=stmt.executeQuery("select*fromStudentInfoorderbyid");

while(rs.next()) {JOptionPane.showMessageDialog(null,"學號:"+rs.getString("ID")+"姓名:"+

rs.getString("name")+"年齡:"+rs.getString("age")+

"\n性別:"+rs.getString("sex")+"系部:"+

rs.getString("department")+"班級:"+rs.getString("class"),

"記錄信息",JOptionPane.INFORMATION_MESSAGE);

}

}

catch(Exceptione){System.out.println(e);}

}

}在J2SE1.6版本中,SUN公司集成了基于完全Java技術(shù)實現(xiàn)的源碼開放的數(shù)據(jù)庫JavaDB(見J2SDK安裝目錄之DB子目錄)。JavaDB實際上是ApacheDerby,初期由Cloudscape、Informix和IBM公司共同所有,后來IBM將其源碼捐贈給Apache作為開源項目,得到了SUN公司及其他個人的擴展,功能日趨完善。JavaDB不僅與J2SDK實現(xiàn)了綁定,同時在SUN的其他產(chǎn)品,諸如SunJavaEnterpriseSystem和SunJavaSystemApplicationServer產(chǎn)品中也實現(xiàn)了綁定。在NetBeansIDE5.0中也實現(xiàn)了對JavaDB的支持。11.2JavaDB嵌入數(shù)據(jù)庫

JavaDB是一個只有2MB的輕量級數(shù)據(jù)庫,可以嵌入到各種Java的應用程序中作為桌面數(shù)據(jù)庫來使用。它支持存儲過程,支持觸發(fā)器和SQL語句,功能極其完備。

JavaDB與J2SDK1.6直接綁定,安裝后J2SDK安裝目錄下將出現(xiàn)“DB”的子目錄。如果用戶使用低版本的J2SDK,則需在Apache網(wǎng)站上下載ApacheDerby,下載后直接安裝即可。使用JavaDB,其步驟同其他數(shù)據(jù)庫基本相似,首先要裝載驅(qū)動。JavaDB的JDBC驅(qū)動集成在derby.jar文件中,無需再下載任何驅(qū)動。裝載采用Class.forName的方法,驅(qū)動名稱為org.apache.derby.jdbc.EmbeddedDriver。如果不使用嵌入數(shù)據(jù)庫模式加載,驅(qū)動還可以選擇其他方式,如采用Client/Server模式或IBMDB2JDBCUniversalDriver的驅(qū)動加載。完整的加載語句如Class.forName("org.apache.derby.jdbc.EmbeddedDriver")。加載驅(qū)動后就要建立數(shù)據(jù)庫的連接。JDBC連接可定義一個獨立的數(shù)據(jù)庫,并允許啟動、停止、復制或刪除數(shù)據(jù)庫。JDBC連接時要定義URL字符串和一組屬性值,使用jdbc:derby:<dbName>[propertyList],其中dbName為數(shù)據(jù)庫名,propertyList為屬性列表,諸如連接的用戶名和口令等。若要建立連接并創(chuàng)建一個名為MySimpDB的數(shù)據(jù)庫,則有

Connectionconn=DriverManager.getConnection(“jdbc:derby:MySimpDB;create=true;user=

user1;password=user1")。常見的屬性有:creat=true/false,標明數(shù)據(jù)庫是否是新創(chuàng)建模式;databaseName=dbName,標明數(shù)據(jù)庫的名稱;user=username,標明連接數(shù)據(jù)庫的用戶名;password=userPassword,標明連接數(shù)據(jù)庫用戶的口令;shutdown=true/false,標明數(shù)據(jù)庫是否為關(guān)閉模式。

連接數(shù)據(jù)庫時,若數(shù)據(jù)庫存在,則建立連接對象;若creat屬性值為true,則創(chuàng)建數(shù)據(jù)庫。創(chuàng)建數(shù)據(jù)庫時,若只創(chuàng)建數(shù)據(jù)庫文件而沒有創(chuàng)建表,則應當調(diào)用Creattable的SQL語句來創(chuàng)建用戶表。例如,完成數(shù)據(jù)庫的創(chuàng)建后,建立狀態(tài)集statement,然后調(diào)用“CreatTable”的SQL語句:

Statements=conn.createStatement();

s.execute(“createtableStudentInfo(idint,namevarchar(12),sexvarchar(2),ageint,departmentvarchar(16),classvachar(16)”);

即可創(chuàng)建一個學生基本信息的用戶表。

一旦用戶信息表建立后,我們就可以對數(shù)據(jù)表中的信息進行新增、刪除、修改等操作,只需調(diào)用不同的SQL語句即可?!纠?1-3】使用JavaDB。

importjava.sql.*;

importjavax.swing.JOptionPane;

publicclassMyDerby

{publicStringframework="embedded";

publicStringdriver="org.apache.derby.jdbc.EmbeddedDriver";

publicStringprotocol="jdbc:derby:";

publicstaticvoidmain(String[]args)

{newMyDerby().go(args);}voidgo(String[]args)

{parseArguments(args);

System.out.println("應用程序工作于"+framework+"模式");

try

{Class.forName(driver).newInstance();

System.out.println("完成裝載數(shù)據(jù)庫驅(qū)動");

Connectionconn=DriverManager.getConnection(protocol+"MySimpDB;create=true;

user=user1;password=user1");System.out.println("連接并創(chuàng)建數(shù)據(jù)庫MySimpDB");

conn.setAutoCommit(false);

Statements=conn.createStatement();

s.execute("DroptableStudentInfo");

s.execute("createtabletempDB(numint,addrvarchar(40))");

s.execute("createtableStudentInfo(idint,namevarchar(12),sexvarchar(2),ageint,

departmentvarchar(16),classvarchar(16))");System.out.println("完成創(chuàng)建用戶表StudentInfo");

s.execute("insertintoStudentInfovalues(20070101,'張三','男',20,'機械學院','機制07-2')");

System.out.println("新增'張三'記錄");

s.execute("insertintoStudentInfovalues(20070102,'李四','男',20,'數(shù)信學院','機制07-1')");

System.out.println("新增'李四'記錄");

s.execute("updateStudentInfosetage=18,department='電信學院'wherename='張三'");

System.out.println("完成修改'張三'記錄");s.execute("updateStudentInfosetsex='女',class='軟件07-2'wherename='李四'");

System.out.println("修改'李四'記錄完成");

ResultSetrs=s.executeQuery("SELECT*FROMStudentInfoORDERBYid");

while(rs.next())

{JOptionPane.showMessageDialog(null,"學號:"+rs.getString("ID")+"姓名:"+rs.getString("name")+"年齡:"+rs.getString("age")+

"\n性別:"+rs.getString("sex")+

"系部:"+rs.getString("department")+

"班級:"+rs.getString("class"),"記錄信息",

JOptionPane.INFORMATION_MESSAGE);

}s.execute("droptabletempDB");

System.out.println("刪除表tempDB");

rs.close();

s.close();

System.out.println("關(guān)閉記錄集和狀態(tài)集");

mit();

conn.close();

System.out.println("執(zhí)行事務,關(guān)閉連接");

booleangotSQLExc=false;

if(framework.equals("embedded")){try

{DriverManager.getConnection("jdbc:derby:;shutdown=true");}

catch(SQLExceptionse)

{gotSQLExc=true;}

if(!gotSQLExc)

{System.out.println("數(shù)據(jù)庫沒有正常關(guān)閉!");}

else

{System.out.println("數(shù)據(jù)庫已經(jīng)關(guān)閉");}

}}

catch(Throwablee){System.out.println("exceptionthrown:");

if(einstanceofSQLException)

{printSQLError((SQLException)e);}

else

{e.printStackTrace();}}

System.out.println("演示示例成功完成");}

staticvoidprintSQLError(SQLExceptione)

{while(e!=null)

{System.out.println(e.toString());e=e.getNextException();}}

privatevoidparseArguments(String[]args)

{intlength=args.length;

for(intindex=0;index<length;index++)

{if(args[index].equalsIgnoreCase("jccjdbcclient"))

{framework="jccjdbc";

driver

溫馨提示

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

評論

0/150

提交評論