?? 應(yīng)用java技術(shù)實現(xiàn)數(shù)據(jù)庫應(yīng)用系統(tǒng).txt
字號:
應(yīng)用Java技術(shù)實現(xiàn)數(shù)據(jù)庫應(yīng)用系統(tǒng)
(加入日期:2002-10-9 點擊數(shù):4929)
【對此文發(fā)表評論】 【編程愛好者論壇】 【保存文章至硬盤】 【打印文章】
[內(nèi)容提要] 本文詳細(xì)介紹了Java數(shù)據(jù)庫編程的JDBC API及java.sql包。并以 Java 技術(shù)設(shè)計、開發(fā)、實踐的一個數(shù)據(jù)庫應(yīng)用管理系統(tǒng)案例為模板,結(jié)合 Java2 平臺程序進(jìn)行說明 Java 面向?qū)ο蟮恼Z言的開發(fā)思路、語言特色、安全機(jī)制以及案例的具體實現(xiàn)步驟、方法及過程等。相信通過本文的介紹,廣大的開發(fā)者會領(lǐng)略 Java 面向?qū)ο笳Z言的風(fēng)采,深深體會 Java 的開發(fā)思想。從而為廣大用戶提供另外一種高效的、前瞻性的管理信息系統(tǒng)及Live Intranet解決方案。
[關(guān)鍵詞] OOP NC JDBC APPLET APPLICATION MIS Live Intranet
Java 語言是Sun MicroSystems 公司于1995年正式命名并推出的一種面向?qū)ο蟮木幊陶Z言-OOP(abbr.Object Oriented Programming)。Sun 公司說:Java 程序設(shè)計語言被設(shè)計成是 by programmers for programmers,其隨著 Internet 的發(fā)展而廣為流行。用它開發(fā)的系統(tǒng)“一次開發(fā),到處運行”的特色以及程序開發(fā)設(shè)計時所體現(xiàn)出的面向?qū)ο蟮乃枷肷钌畹赜|動著人們。它的語言簡潔、集多種程序設(shè)計語言之大成,且面向?qū)ο蟆⒕哂锌梢浦残浴⒎植夹浴踩浴⒏咝阅艿忍厣ava在向Internet/Intranet,甚至計算機(jī)世界的各個領(lǐng)域滲透,慢慢改變著人們的思維。而今Internet 熱浪一浪高過一浪,從外部世界走向企業(yè)內(nèi)部形成Intranet,促進(jìn)了Java 技術(shù)的利用開發(fā)。計算機(jī)業(yè)界中的IBM、ORACAL 、APPLE、Sun、Netscape五家公司還聯(lián)合推出“網(wǎng)絡(luò)計算機(jī)(NC-1)”規(guī)范。拋開“Wintel”臃腫不堪的體系結(jié)構(gòu),使用戶端價格低廉、易于使用,并成為能夠連接網(wǎng)絡(luò)的簡單計算機(jī)-NC(Network Computer),即所說的“瘦客戶”機(jī),NC 支持Java 虛擬機(jī)(JVM),能夠運行Java開發(fā)的應(yīng)用程序(Application)和小程序(Applet)并支持多媒體應(yīng)用。NC 和Java 的結(jié)合誕生了新的時代:網(wǎng)絡(luò)計算機(jī)時代。就連Sun的冤家對頭Microsoft的比爾.蓋茨也不得不承認(rèn):“Java是長時間以來最卓越的程序設(shè)計語言”。
一、 Java 數(shù)據(jù)庫基礎(chǔ) JDBC API
Java語言在數(shù)據(jù)庫應(yīng)用方面,特別在基于Web 的B/S結(jié)構(gòu)的在線數(shù)據(jù)庫應(yīng)用方面的煩瑣復(fù)雜配置等,并不能使用戶和程序開發(fā)雙方都十分滿意。SunSoft雖提供了用Java語言編寫成的Java與數(shù)據(jù)庫的接口規(guī)范JDBC(Java DataBase Connectivity,而JavaSoft說JDBC并不代表什么),使Java程序可以通過統(tǒng)一標(biāo)準(zhǔn)規(guī)范的JDBC API來與不同的數(shù)據(jù)庫通信。確保了“100%純Java”的解決方案。JDBC API 定義了Java中的類和接口,表示數(shù)據(jù)庫連接、SQL 指令、結(jié)果集合等。它允許Java程序員發(fā)送SQL 指令并處理結(jié)果。JDBC API 提供兩種主要接口:一是面向開發(fā)人員的java.sql程序包,使得Java程序員能夠進(jìn)行數(shù)據(jù)庫連接,執(zhí)行SQL查詢,并得到結(jié)果集合。Java2 的java.sql包提供了6個類和18個接口,下文將介紹;另一是面向底層數(shù)據(jù)庫廠商的JDBC Drivers ,目前為止,Java2的JDBC Drivers僅提供下述四種類型的數(shù)據(jù)庫驅(qū)動方式,且各有利弊:
(1) JDBC-ODBC bridge plus ODBC driver 方式:JDBC-ODBC 橋接方式利用微軟的開放數(shù)據(jù)庫互連接口(ODBC API)同數(shù)據(jù)庫服務(wù)器通訊,客戶端計算機(jī)首先應(yīng)該安裝并配置ODBC driver 和JDBC-ODBC bridge兩種驅(qū)動程序。這是Applets訪問你的數(shù)據(jù)庫最可能的解決方式,但這對Internet 和Intranet 用戶而言簡直是一個非常令人討厭和麻煩的解決方案。
(2) Native-API partly Java driver方式:這種驅(qū)動方式將數(shù)據(jù)庫廠商的特殊協(xié)議轉(zhuǎn)換成Java代碼及二進(jìn)制類碼,使Java 數(shù)據(jù)庫客戶方與數(shù)據(jù)庫服務(wù)器方通信。例如:Oracle用SQLNet協(xié)議,DB2用IBM 的數(shù)據(jù)庫協(xié)議。數(shù)據(jù)庫廠商的特殊協(xié)議也應(yīng)該被安裝在客戶機(jī)上。這也是令人討厭和麻煩的解決方案。
(3) JDBC-Net pure Java driver方式:這種方式是純Java driver。數(shù)據(jù)庫客戶以標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議(如HTTP、SHTTP)同數(shù)據(jù)庫訪問服務(wù)器通信,數(shù)據(jù)庫訪問服務(wù)器然后翻譯標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議成為數(shù)據(jù)庫廠商的專有特殊數(shù)據(jù)庫訪問協(xié)議(也可能用到ODBC driver)與數(shù)據(jù)庫通信。對Internet 和Intranet 用戶而言這是一個理想的解決方案。Java driver 被自動的,以透明的方式隨Applets自Web服務(wù)器而下載并安裝在用戶的計算機(jī)上。
(4) Native-protocol pure Java driver方式:這種方式也是純Java driver。數(shù)據(jù)庫廠商提供了特殊的JDBC協(xié)議使Java數(shù)據(jù)庫客戶與數(shù)據(jù)庫服務(wù)器通信。然而,將把代理協(xié)議同數(shù)據(jù)庫服務(wù)器通信改用數(shù)據(jù)庫廠商的特殊JDBC driver。這對Intranet 應(yīng)用是高效的,可是數(shù)據(jù)庫廠商的協(xié)議可能不被防火墻支持,缺乏防火墻支持在Internet 應(yīng)用中會存在潛在的安全隱患。
綜上四種方式中,只有第三、四種方式的驅(qū)動支持 Applet的零安裝。因為JDBC drivers 完全用Java 寫成,并從Web 服務(wù)器上隨applet下載。為了支持零安裝,驅(qū)動程序應(yīng)該被放在Web上,并與applet 在相同目錄。而第四種存在安全隱患,第三種產(chǎn)品為數(shù)不多,現(xiàn)今較成熟的IDS JDBC driver屬于此種(http://www.idssoftware.com),但也要用到ODBC driver輔助。
即便如此,利用Java技術(shù)開發(fā)單機(jī)環(huán)境應(yīng)用程序,局域網(wǎng)范圍或Intranet環(huán)境下的應(yīng)用程序、動態(tài)Web應(yīng)用(Live Intranet)等,Java語言是高效、安全、穩(wěn)定的。Java語言已贏得了眾多廠商的支持,基于其上的Java API-JDBC也發(fā)展迅速。Sun承諾任何Java Applet 或Java應(yīng)用軟件都能夠與數(shù)據(jù)庫結(jié)合,并且仍將不遺余力的支持未來Java技術(shù)的發(fā)展。Java語言的跨平臺特性,使之成為Internet和Intranet環(huán)境下開發(fā)數(shù)據(jù)庫應(yīng)用系統(tǒng)的理想選擇方案。
二、 Java 數(shù)據(jù)庫應(yīng)用系統(tǒng)的實現(xiàn)
基于此,筆者用Java 2 SDK,Standard Edition Version 1.2.1版本為開發(fā)工具,以已經(jīng)成功開發(fā)的Java數(shù)據(jù)庫應(yīng)用系統(tǒng)案例為模板,結(jié)合Java2程序語句及java.sql包,介紹一下Java數(shù)據(jù)庫應(yīng)用系統(tǒng)開發(fā)的具體實現(xiàn)步驟、方法等。
1.設(shè)置數(shù)據(jù)庫的連接
為了利用JDBC,你將需要一個數(shù)據(jù)庫服務(wù)器和一個數(shù)據(jù)庫驅(qū)動器。因為大多數(shù)讀者的計算機(jī)已經(jīng)安裝了Windows95/98,我就用微軟的 Access 97做為我的數(shù)據(jù)庫服務(wù)器(具體為Action.mdb),當(dāng)然你也可以用其它的數(shù)據(jù)庫作為數(shù)據(jù)庫服務(wù)器。因為對JDBC而言,數(shù)據(jù)庫服務(wù)器的類型無關(guān)緊要,JDBC會提供一個獨立于數(shù)據(jù)庫服務(wù)器的訪問數(shù)據(jù)庫的方法。這是JDBC的主要優(yōu)勢所在。
你將還需要一個數(shù)據(jù)庫驅(qū)動器,用來提供JDBC與你的數(shù)據(jù)庫的連接。作者選用了較可能的JDBC-ODBC bridge 方式。為此需設(shè)置32-bit ODBC的數(shù)據(jù)源,選擇System DSN(數(shù)據(jù)可被多用戶訪問,User DSN不同),增加新的數(shù)據(jù)源,配置新數(shù)據(jù)源的路徑為Action.mdb數(shù)據(jù)庫服務(wù)器的所在位置。
安裝完成,Java程序員可以進(jìn)行編制程序的階段。首先程序員引用java.sql 包中相應(yīng)的類與接口來進(jìn)行對JDBC驅(qū)動器的管理:用Class 類中的 forName() 方法裝入 JDBC驅(qū)動器,以JDBC-ODBC bridge 方式為例,裝入JDBC驅(qū)動執(zhí)行的語句為Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);用DriverManager 類中g(shù)etDrivers()方法返回所有安裝在你的計算機(jī)中的JDBC驅(qū)動器,getConnection()建立與數(shù)據(jù)庫的連接等。getConnection()方法提供下面三種形式:
getConnection(String url)
getConnection(String url,String userID,String password)
getConnection(String url,Properties arguments)
其中字符串url表示數(shù)據(jù)庫服務(wù)器所在處的特殊的URL。URL是被用來與不同的數(shù)據(jù)庫驅(qū)動建立連接的統(tǒng)一網(wǎng)絡(luò)資源,其形式如下:
jdbc:subprotocol:subname
所有的JDBC數(shù)據(jù)庫協(xié)議開始于jdbc:。Subprotocol是被用來辨別JDBC驅(qū)動方式的。例如:JDBC-ODBC bridge 用jdbc:odbc:subname 這種用戶協(xié)議形式,IDS JDBC driver 用jdbc:ids:subname 形式。數(shù)據(jù)庫協(xié)議的subname標(biāo)識數(shù)據(jù)庫并且與subprotocol 和JDBC驅(qū)動方式有關(guān)。例如,以JDBC-ODBC bridge方式,我用下面的URL形式建立與數(shù)據(jù)源Tend建立連接:
jdbc:odbc:tend
getDrivers()和getConnection()方法是DriverManager類中最重要的方法,還有其它一些方法在此略。
2.與數(shù)據(jù)庫進(jìn)行連接
用DriverManager類的getConnection() 方法建立起與數(shù)據(jù)庫連接,getConnection()返回一個對象,此對象是java.sql包中的Connection 接口對象。該接口定義了與之連接的數(shù)據(jù)庫交互的一些方法、常量等,這些方法用來管理數(shù)據(jù)庫的連接、獲得連接的信息、提交數(shù)據(jù)庫處理事件并且預(yù)處理可執(zhí)行的SQL語句。下面是Connection 接口的一些重要的方法:
close()-關(guān)閉一個數(shù)據(jù)庫連接
getMetaData()-返回一個DatabaseMetaData 接口對象,該接口能被用來獲得有關(guān)數(shù)據(jù)庫的詳細(xì)信息,包括數(shù)據(jù)庫結(jié)構(gòu)和數(shù)據(jù)庫內(nèi)容等。
createStatement()-創(chuàng)建一個SQL語句對象。
prepareStatement()-用SQL字符串創(chuàng)建一個SQL 預(yù)處理語句對象。預(yù)處理語句對象是可以被高效執(zhí)行的預(yù)編譯過的SQL語句。
下面提供一段程序,實現(xiàn)了JDBC的驅(qū)動及數(shù)據(jù)庫的連接,供參考:
import java.sql.*;
import java.util.*;
class ConnectApp {
public static void main(String args[]) {
try{
// Load the JDBC-ODBC bridge driver方式
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url="jdbc:odbc:tend";
// 連接到數(shù)據(jù)庫
Connection connection=DriverManager.getConnection(url);
// 得到數(shù)據(jù)庫的信息
DatabaseMetaData meta=connection.getMetaData();
3.利用結(jié)果集工作
數(shù)據(jù)庫查詢被執(zhí)行后,查詢的結(jié)果作為一個兩維(行、列)數(shù)據(jù)表返回。ResultSet接口被用來提供訪問查詢結(jié)果的數(shù)據(jù)表,查詢結(jié)果被當(dāng)作ResultSet對象而返回,ResultSet對象提供“指針”,指針每次訪問數(shù)據(jù)庫表的一行。當(dāng)ResultSet對象從查詢中返回時,指針初始指向數(shù)據(jù)表的第一行,ResultSet 的next() 方法用來移動指針到數(shù)據(jù)表的下一行,如果到達(dá)表尾,next() 方法返回假的布爾值-false,否則為真。ResultSet接口提供大量的獲得數(shù)據(jù)的方法,這些方法返回數(shù)據(jù)表中任意位置的數(shù)據(jù),不論是基本數(shù)據(jù)類型或引用數(shù)據(jù)類型的數(shù)據(jù)。getMetaData()方法返回ResultSetMetaData接口對象,該對象包含數(shù)據(jù)表行的信息。ResultSetMetaData 接口提供變量和從ResultSet對象獲取信息的方法,getColumnCount() 方法返回數(shù)據(jù)表的列數(shù),getColumnName() 方法返回提取的數(shù)據(jù)庫中的列名稱,即數(shù)據(jù)庫字段名,getColumnType() 方法返回列的SQL類型,ResultMetaData中其它的方法被用訪問列的額外屬性,如列的顯示寬度、數(shù)據(jù)格式及讀/寫狀態(tài)等。注意ResultSet中的列其始索引號為1而不是0。下面提供一段程序:
static void displayResults(ResultSet r) throws SQLException {
// 獲得數(shù)據(jù)結(jié)果集合
ResultSetMetaData rmeta = r.getMetaData();
// 確定數(shù)據(jù)集的列數(shù),亦字段數(shù)
int numColumns=rmeta.getColumnCount();
// 輸出每一個數(shù)據(jù)值
for(int i=1;i<=numColumns;++i) {
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -