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

下載本文檔

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

文檔簡(jiǎn)介

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

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

11.3小結(jié)

11.4習(xí)題

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

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

1.ODBC

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

2.?JDBC的概念

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

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

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

3.?JDBC術(shù)語(yǔ)

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

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

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

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

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

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

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

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

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

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

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

要實(shí)現(xiàn)JDBC編程,必須按照J(rèn)DBC的執(zhí)行過程來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問。首先我們來(lái)了解JDBC的執(zhí)行過程。

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

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

(1)加載驅(qū)動(dòng)程序,以語(yǔ)句Class.forName(“driverName”)來(lái)實(shí)現(xiàn)。

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

實(shí)現(xiàn)。

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

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

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

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

2.加載驅(qū)動(dòng)

在JDBC編程時(shí),通常有三種方式來(lái)加載驅(qū)動(dòng)程序:

●利用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)建一個(gè)驅(qū)動(dòng)程序?qū)ο螅鏽ewsun.jdbc.odbc.JdbcOdbcDriver()。

3.連接對(duì)象

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

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

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

4.狀態(tài)集

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

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

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

Statement對(duì)象還可由execute(Stringsql)來(lái)直接執(zhí)行SQL語(yǔ)句。

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

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

PreparedStatementpstmt=con.PreparedStatement;

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

pstmt.setString(“John”);

pstmt.setInt(1234556);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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,"學(xué)號(hào):"+rs.getString("ID")+

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

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

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

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

JOptionPane.INFORMATION_MESSAGE);

}

}

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

}

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

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,"學(xué)號(hào):"+rs.getString("ID")+"姓名:"+

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

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

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

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

}

}

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

}

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

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

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

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

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

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

Statements=conn.createStatement();

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

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

一旦用戶信息表建立后,我們就可以對(duì)數(shù)據(jù)表中的信息進(jìn)行新增、刪除、修改等操作,只需調(diào)用不同的SQL語(yǔ)句即可。【例11-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("應(yīng)用程序工作于"+framework+"模式");

try

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

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

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

user=user1;password=user1");System.out.println("連接并創(chuàng)建數(shù)據(jù)庫(kù)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,'機(jī)械學(xué)院','機(jī)制07-2')");

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

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

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

s.execute("updateStudentInfosetage=18,department='電信學(xué)院'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,"學(xué)號(hào):"+rs.getString("ID")+"姓名:"+rs.getString("name")+"年齡:"+rs.getString("age")+

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

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

"班級(jí):"+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í)行事務(wù),關(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ù)庫(kù)沒有正常關(guān)閉!");}

else

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

評(píng)論

0/150

提交評(píng)論