1.JDBC簡(jiǎn)介
隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的發(fā)展且在它的推動(dòng)下, Java語言現(xiàn)已成為一個(gè)流行的網(wǎng)絡(luò)編程" title="網(wǎng)絡(luò)編程">網(wǎng)絡(luò)編程語言,這不僅是由于Java獨(dú)有的面向?qū)ο?、安全性、多線程、平臺(tái)無關(guān)性等眾多的特點(diǎn)的,而且是因?yàn)镴ava有了JDBC,JDBC是Java技術(shù)最重要且最實(shí)用的部分之一,它為計(jì)算機(jī)網(wǎng)絡(luò)編程提供了強(qiáng)大的數(shù)據(jù)支持。JDBC即Java Database Connectivity,它實(shí)現(xiàn)了Java與數(shù)據(jù)庫(kù)的互連,它提供了一組標(biāo)準(zhǔn)的API(Application Programming Interface,應(yīng)用程序設(shè)計(jì)" title="程序設(shè)計(jì)">程序設(shè)計(jì)接口)調(diào)用來進(jìn)行對(duì)數(shù)據(jù)庫(kù)的訪問,也就是說JDBC API是Java程序設(shè)計(jì)語言中訪問數(shù)據(jù)的接口。有了JDBC就使Java的應(yīng)用范圍擴(kuò)展到了數(shù)據(jù)庫(kù)領(lǐng)域。在JDK以前的版本中,JDBC只是一個(gè)可選部件,到了JDK1.1公布時(shí)及其以后的版本中,SQL類包(也就是JDBC API)已成為Java語言的標(biāo)準(zhǔn)部件。JDBC由一組用Java編程語言" title="編程語言">編程語言寫的類和接口組成,它為數(shù)據(jù)庫(kù)應(yīng)用開發(fā)人員、數(shù)據(jù)庫(kù)前臺(tái)工具開發(fā)人員提供了一種標(biāo)準(zhǔn)的應(yīng)用程序設(shè)計(jì)接口,使開發(fā)人員可以很方便地將SQL語句傳送給幾乎任何一種數(shù)據(jù)庫(kù)。也就是說,開發(fā)人員可以不需要為了訪問Oracle、Sybase或Microsoft的SQLServer而寫3個(gè)不同的程序,而是只要寫一個(gè)程序就可訪問Oracle、Sybase或Microsoft的SQLServer。它力求達(dá)到的是Java應(yīng)用如何同各種各樣的數(shù)據(jù)庫(kù)連接,而JDBC正是實(shí)現(xiàn)這種連接的關(guān)鍵。
2. 開發(fā)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的模型
JDBC支持兩層應(yīng)用模型及三層應(yīng)用模型。在兩層應(yīng)用模型中客戶端瀏覽器中運(yùn)行的程序(例如:Java applet)可以直接與數(shù)據(jù)庫(kù)服務(wù)器相連,直接訪問此數(shù)據(jù)庫(kù),如圖1所示。在兩層模型中,因?yàn)槭浅绦蛑苯油瑪?shù)據(jù)庫(kù)連接。這就需要能直接被訪問的數(shù)據(jù)庫(kù)進(jìn)行連接的JDBC驅(qū)動(dòng)器。用戶的SQL語句被傳送給數(shù)據(jù)庫(kù),而這些語句執(zhí)行的結(jié)果將被傳回給用戶。在三層應(yīng)用模型中客戶端瀏覽器中運(yùn)行的程序不可以直接與數(shù)據(jù)庫(kù)服務(wù)器相連,不能直接訪后臺(tái)數(shù)據(jù)庫(kù),而是在這兩者之間增加了一個(gè)中間Web服務(wù)器,如圖2所示。首先客戶機(jī)與中間服務(wù)器通信,由中間服務(wù)器處理客戶機(jī)的請(qǐng)求,其命令將被發(fā)送到中間Web服務(wù)器,而中間Web服務(wù)器將SQL語句發(fā)送到數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)處理SQL語句并將結(jié)果返回中間Web服務(wù)器,然后中間Web服務(wù)器將它們返回用戶。也就是說在三層應(yīng)用模型中由中間服務(wù)器使用JDBC訪問數(shù)據(jù)庫(kù)。
3. JDBC的任務(wù)及JavaSQL包
??? JDBC能完成下列三件任務(wù): ⑴同一個(gè)數(shù)據(jù)庫(kù)建立連接;⑵向數(shù)據(jù)庫(kù)發(fā)送SQL語句;⑶處理數(shù)據(jù)庫(kù)返回的結(jié)果,而完成這些任務(wù),要使用到j(luò)ava.sql包中的一系列類(class)、接口(interface)、方法(method)。 實(shí)際上JDBC的是兩組面向應(yīng)用程序和數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序開發(fā)人員的API,以及將前者向后者轉(zhuǎn)化的內(nèi)在封裝邏輯。這兩組API即:面向數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序開發(fā)人員的接口:JDBC Driver API和面向應(yīng)用程序開發(fā)人員的接口JDBC API,前者是提供給數(shù)據(jù)庫(kù)管理系統(tǒng)" title="管理系統(tǒng)">管理系統(tǒng)的生產(chǎn)廠家的,一般的網(wǎng)頁(yè)編程開發(fā)人員不需要知道也可,而JDBC API有兩個(gè)包java.sql和javax.sql,這是Java核心框架的組成部分,網(wǎng)絡(luò)編程人員通過一定的規(guī)則調(diào)用這些包中的API,就可以能夠?qū)崿F(xiàn)對(duì)數(shù)據(jù)庫(kù)管理系統(tǒng)的訪問,開發(fā)各種動(dòng)態(tài)網(wǎng)站系統(tǒng)。這個(gè)包中最重要的接口是:
??? ⑴java.sql.DriverManager: 用來加載" title="加載">加載不同的JDBC驅(qū)動(dòng)程序,對(duì)于給定的每一個(gè)連接請(qǐng)求,它將會(huì)依次讓每一個(gè)驅(qū)動(dòng)程序盡可能連接到目標(biāo)URL上,為創(chuàng)建新的數(shù)據(jù)庫(kù)鏈接提供支持。
??? ⑵java.sql.Connection:完成對(duì)某一制定數(shù)據(jù)庫(kù)的連接功能。而連接是與給定數(shù)據(jù)庫(kù)的會(huì)話,當(dāng)連接成功時(shí),SQL才被執(zhí)行和返回結(jié)果。
??? ⑶java.sql.Statement:用來在一個(gè)已經(jīng)創(chuàng)建的連接中,執(zhí)行SQL語句并包含語句所產(chǎn)生的結(jié)果,即作為執(zhí)行SQL語句的容器。在執(zhí)行的任何時(shí)候,一個(gè)語句只能打開一個(gè)結(jié)果集。
??? ⑷java.sql.Result:代表特定SQL語句執(zhí)行后的數(shù)據(jù)庫(kù)結(jié)果集。
4. 通過JDBC訪問Web數(shù)據(jù)庫(kù)
??? 要通過JDBC訪問數(shù)據(jù)庫(kù),可以分以下幾步完成
??? ⑴加載驅(qū)動(dòng)程序:為了和的特定數(shù)據(jù)庫(kù)鏈接,JDBC首先必須加載相應(yīng)的驅(qū)動(dòng)程序,驅(qū)動(dòng)程序可以使用最常用的JDBC-ODBC bridge驅(qū)動(dòng)程序,其方法為使用Class.forName();方法,也可以使用JDBC到通用網(wǎng)絡(luò)協(xié)議的驅(qū)動(dòng)程序;還可以使用由數(shù)據(jù)庫(kù)廠商提供的驅(qū)動(dòng)程序,其加載方法都一樣要使用Class.forName()方法, 且在此方法的括號(hào)中填入驅(qū)動(dòng)器名即可,例如使用JDBC-ODBC bridge驅(qū)動(dòng)程序,程序代碼書寫格式為Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);,也可以在Class.forName()方法括號(hào)中填入一系列用冒號(hào)隔開的驅(qū)動(dòng)器名,例如:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver:oracle.jdbc.driver.OracleDriver”);,這時(shí)JDBC將按照表的順序搜索驅(qū)動(dòng)程序,并使用第一個(gè)能成功地與給定的URL相連的驅(qū)動(dòng)程序。
??? ⑵建立同數(shù)據(jù)庫(kù)的連接:DriverManager類中的方法getConnection用于建立于某個(gè)數(shù)據(jù)庫(kù)鏈接。在與較小型的數(shù)據(jù)庫(kù)例如Foxpro、Access連接時(shí),只要指出數(shù)據(jù)源信息而不需要任何其他的附加條件,例如:
java.lang.String strCon = 'jdbc:odbc:st';
java.sql.Connection jsCon = java.sql.DriverManager.getConnection(strCon); 但在大型數(shù)據(jù)庫(kù)中建立連接時(shí)需要給出用戶名和密碼,其使用方法為:
Connection Con = java.sql.DriverManager.getConnection(String url,String user,String password);。
??? ⑶申請(qǐng)進(jìn)行數(shù)據(jù)庫(kù)操作的對(duì)象:建立連接后,在實(shí)際的數(shù)據(jù)庫(kù)操作之前,要獲得操作數(shù)據(jù)庫(kù)的語句對(duì)象。其方法為,利用Con對(duì)象生成一個(gè)java.sql.Statement對(duì)象,此對(duì)象可以負(fù)責(zé)完成將SQL語句傳遞給數(shù)據(jù)庫(kù)管理系統(tǒng)執(zhí)行等任務(wù)。
??? ⑷進(jìn)行數(shù)據(jù)庫(kù)操作:數(shù)據(jù)庫(kù)操作工作包括查詢表、更新表等,可以分別使用SQL SELECT、SQL UPDATE和SQL INSERT語句來完成。數(shù)據(jù)庫(kù)的查詢和修改操作分別通過executeQuery()和executeUpdate()方法實(shí)現(xiàn)。格式為:
java.sql.ResultSet jsRes = jsSta.executeQuery(strSQL);
??? ⑸對(duì)數(shù)據(jù)庫(kù)操作的結(jié)果進(jìn)行處理:查詢操作返回的結(jié)果集要進(jìn)行處理,例如:按照某種數(shù)據(jù)類型取出數(shù)據(jù)庫(kù)中某一列的值其程序代碼格式為:
int SID = jsRes.getInt(4);
String TName = jsRes.getString('WSTName');。
⑹關(guān)閉數(shù)據(jù)庫(kù)操作對(duì)象:數(shù)據(jù)庫(kù)操作結(jié)束后,要將數(shù)據(jù)庫(kù)操作結(jié)果集以及申請(qǐng)的語句對(duì)象和建立的數(shù)據(jù)庫(kù)鏈接關(guān)閉。其程序代碼為:
java.sql.Connection jsCon=null; //數(shù)據(jù)庫(kù)連接對(duì)象
java.sql.Statement jsSta=null; //SQL語句對(duì)象
java.sql.ResultSet jsRes=null; //結(jié)果集對(duì)象
… …
jsRes.close();//關(guān)閉結(jié)果集
jsSta.close();//關(guān)閉SQL語句對(duì)象
jsCon.close();//關(guān)閉數(shù)據(jù)庫(kù)??
5.實(shí)例
??? 數(shù)據(jù)庫(kù)連接是網(wǎng)絡(luò)編程的重要部分, Java程序就通過JDBC驅(qū)動(dòng)程序與數(shù)據(jù)庫(kù)相連,執(zhí)行查詢、提取、插入數(shù)據(jù)等等操作。我完成的省級(jí)課題基于Java技術(shù)的通用考試系統(tǒng),采用Java JDBC技術(shù)對(duì)于數(shù)據(jù)庫(kù)進(jìn)行連接,微軟公司Access2000數(shù)據(jù)庫(kù)系統(tǒng)為后臺(tái)數(shù)據(jù)庫(kù),其數(shù)據(jù)庫(kù)中包含5個(gè)表:學(xué)生信息表USER:用于存放考生的信息,包括學(xué)號(hào)、考號(hào)、班級(jí)、姓名、交卷標(biāo)記及考試成績(jī)等;考試科目分類表TMFL:用于存放課程信息,包括各課程的名稱及課程代碼等;試題信息表TMXX:用于存放各課程的試題,為了便于管理;答題表TATIB:用于存放所有考生的答題信息,包括學(xué)號(hào)、題號(hào)、答題信息等;答題目錄表TATIML等:用于管理答題結(jié)果。此系統(tǒng)中連接數(shù)據(jù)庫(kù)且獲得數(shù)據(jù)的關(guān)鍵代碼為:
… … … …
java.sql.Connection jsCon; //數(shù)據(jù)庫(kù)連接對(duì)象
java.sql.Statement jsSta; //SQL語句對(duì)象
java.sql.ResultSet jsRes; //結(jié)果集對(duì)象
java.lang.String strCon;??? //數(shù)據(jù)庫(kù)連接字符串
java.lang.String strSQL;??? //SQL語句
int RCount=0;
int CIndex=0;
int Len=0;
double i=0;
int j=0;
… … … …
Class.forName('sun.jdbc.odbc.JdbcOdbcDriver');//裝載JDBC驅(qū)動(dòng)程序
strCon = 'jdbc:odbc:st';//設(shè)置數(shù)據(jù)庫(kù)連接字符串
jsCon = java.sql.DriverManager.getConnection(strCon); //連接數(shù)據(jù)庫(kù)
jsSta = jsCon.createStatement();//創(chuàng)建一個(gè)可以滾動(dòng)的只讀的SQL語句對(duì)象
… … … …
strSQL = 'select WSTName,DSTName,STDD,STID,keID from TMXX where STID='+j ; //準(zhǔn)備SQL語句
//執(zhí)行SQL語句并獲取結(jié)果集
jsRes = jsSta.executeQuery(strSQL);
while( jsRes.next()){?
int SID = jsRes.getInt(2);
String? STDD = jsRes.getString('STDD');
String? TName = jsRes.getString('WSTName');
String DSTN=jsRes.getString('DSTName');
…? …? …? … }
jsRes.close();//關(guān)閉結(jié)果集
jsSta.close();//關(guān)閉SQL語句對(duì)象
jsCon.close();//關(guān)閉數(shù)據(jù)庫(kù)??
… … … …}
??? 基于Java技術(shù)的通用考試系統(tǒng),從數(shù)據(jù)庫(kù)中獲得數(shù)據(jù)且顯示題目的界面如圖3所示。
??
參考文獻(xiàn)
[1] 王克宏.Java語言SQL接口[M].北京:清華大學(xué)出版社,1997.
[2] 雨陽隆春.深入JSP網(wǎng)絡(luò)編程[M]. 北京:清華大學(xué)出版社,2001.
[3] 路新春,劉國(guó)玲.JSP應(yīng)用中的信息共享與傳遞技術(shù)[J].計(jì)算機(jī)應(yīng)用,2003,(3)
基金項(xiàng)目:新疆自治區(qū)少數(shù)民族科技骨干人才特殊培養(yǎng)科研專項(xiàng)資金項(xiàng)目(2001—5)