




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2019-2025年中國(guó)智能零售市場(chǎng)評(píng)估分析及發(fā)展前景調(diào)查戰(zhàn)略研究報(bào)告
- 2025年臥式家具項(xiàng)目可行性研究報(bào)告
- 2025年磷酸苯丙哌林項(xiàng)目可行性研究報(bào)告
- 鋼材協(xié)議戶合同范本
- 2025年建筑工程用機(jī)械項(xiàng)目安全調(diào)研評(píng)估報(bào)告
- 2024-2025學(xué)年高中物理課時(shí)作業(yè)8自由落體運(yùn)動(dòng)規(guī)律含解析粵教版必修1
- 2025年無(wú)彈小花邊項(xiàng)目投資可行性研究分析報(bào)告
- 水泥改性劑行業(yè)市場(chǎng)發(fā)展及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 中國(guó)箱式房市場(chǎng)深度分析及投資戰(zhàn)略咨詢報(bào)告
- 中國(guó)讀圖板項(xiàng)目投資可行性研究報(bào)告
- 《商務(wù)溝通-策略、方法與案例》課件 第四章 非言語(yǔ)溝通
- 附件2:福建省建設(shè)工程造價(jià)咨詢服務(wù)收費(fèi)指導(dǎo)價(jià)
- 《金融衍生品》課件
- 2024年粉塵爆炸專項(xiàng)培訓(xùn)試題及答案
- 超齡員工用工免責(zé)協(xié)議書
- 伙食原料第二保質(zhì)期標(biāo)準(zhǔn)執(zhí)行表
- 金波讀書樂課件
- 靜脈治療輸液工具的選擇2024課件
- KTV常見飛單方法
- 2024肥胖癥診療指南亮點(diǎn)內(nèi)容解讀課件
- 課程設(shè)計(jì)存在問題和建議
評(píng)論
0/150
提交評(píng)論