對于JDBC的介紹
發(fā)表時間:2023-08-12 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]華南木棉站關(guān)于JDBC的介紹 發(fā)信人: yeal (破光盤), 信區(qū): JAVA 標 題: JDBC(1) 發(fā)信站: 華南網(wǎng)木棉站 (Mon Feb 1 00:03:32 1999), 轉(zhuǎn)信 1. ...
華南木棉站關(guān)于JDBC的介紹
發(fā)信人: yeal (破光盤), 信區(qū): JAVA
標 題: JDBC(1)
發(fā)信站: 華南網(wǎng)木棉站 (Mon Feb 1 00:03:32 1999), 轉(zhuǎn)信
1. 介紹
許多開發(fā)者和用戶都在尋找Java程序中訪問數(shù)據(jù)庫的便捷方
法。由于Java是一個健壯,安全,易于使用的,易于理解且可
以從網(wǎng)絡(luò)中自動download ,所以它成為開發(fā)數(shù)據(jù)庫應(yīng)用的一種
良好的語言基礎(chǔ)。它提供了C,C++,Smalltalk, BASIC, COBOL,
and 4GLs的許多優(yōu)點。許多公司已經(jīng)開始在Java與DBMS的連接
方面做工作。
許多Java應(yīng)用開發(fā)者都希望能夠編寫?yīng)毩⒂谔囟―BMS的程
序,而我們也相信一個獨立于DBMS的接口將使得與各種各樣
DBMS連接變得最為便捷,開發(fā)更加迅速。所以我們認為定義
一個通用的SQL數(shù)據(jù)庫存取框架,在各種各樣的提供數(shù)據(jù)庫連
接模塊上提供統(tǒng)一的界面是十分有意義的。這使程序員可以面
對單一的數(shù)據(jù)庫界面,使數(shù)據(jù)庫無關(guān)的Java工具和產(chǎn)品成為可
能,使得數(shù)據(jù)庫連接的開發(fā)者可以提供各種各樣的連接方案。
我們看到我們定義一個通用低層的,支持基本SQL功能的Java
DataBase Connectivity (JDBC)API的緊迫任務(wù)。
幸運的是我們不必從頭設(shè)計一個SQL API。我們可以把我們的
工作建立在
X/Open SQL CLI (調(diào)用層接口)之上(它也是Microsoft's ODBC
的基礎(chǔ))。
我們主要任務(wù)是定義一個自然的Java接口來與X/Open CLI中定
義的基本的抽象層和概念連接。
JDBC API得到數(shù)據(jù)庫開發(fā)廠商,連接開發(fā)廠商,ISV,以及應(yīng)用
開發(fā)者的支持是十分重要的。我們相信把我們的工作建立在
ODBC抽象層的基礎(chǔ)上將JDBC更加容易得到大家的接受。而且
從技術(shù)上來說,ODBC是我們設(shè)計工作的一個良好基礎(chǔ)。
因為ODBC是一個C語言接口,所以O(shè)DBC在Java中直接使用不
適當(dāng)。從Java中來調(diào)用C代碼在安全性,健壯性,實現(xiàn)的方便,
可移植性等等方面有許多不便。它使得Java在這些方面的許多
優(yōu)點得不到發(fā)揮。
我們已經(jīng)在短期里面實現(xiàn)了一個建立在ODBC上的API。長遠來
看,我們可以通過其他方式提供實現(xiàn)。
1.1. 注意
我們非常感謝在數(shù)據(jù)庫,數(shù)據(jù)庫連接和數(shù)據(jù)庫工具領(lǐng)域的許多
早期的工作者。他們?yōu)镴DBC的早期草案提供了很好的意見和
建議。他們的工作對本規(guī)范起了不可估量的作用。
--
※ 來源:.華南網(wǎng)木棉站 bbs.gznet.edu.cn.[FROM: 202.38.240.203]
--------------------------------------------------------------------------------
[返回首頁] [討論區(qū)]
發(fā)信人: yeal (破光盤), 信區(qū): JAVA
標 題: JDBC(2)
發(fā)信站: 華南網(wǎng)木棉站 (Mon Feb 1 00:04:05 1999), 轉(zhuǎn)信
2. 目標與哲學(xué)
這個部分描述了指引這個API開發(fā)的目標以及哲學(xué)。
2.1. SQL 級 API
我們的主要目標是為Java定義一個“調(diào)用級”(call-level)的SQL
接口。著意味著我們主要的注意力集中在執(zhí)行原原本本的SQL
語句并且取回結(jié)果。我們預(yù)計高層的API也將被定義,這些可
能將建立在基層的接口上。
這些高層接口包括象直接地、透明地把表里面的數(shù)據(jù)影射到
Java類里面,用語法樹表示更加通用的查詢,以及Java內(nèi)嵌的
SQL語法。
我們希望大量的應(yīng)用開發(fā)工具將使用我們的API。然而我們也
希望程序員能夠使用我們的API,尤其是目前這樣在Java里沒
有任何其他手段(應(yīng)該是說數(shù)據(jù)庫訪問手段)的情況下。
2.2. 遵循SQL
數(shù)據(jù)庫系統(tǒng)支持各式各樣的SQL語法和語義,它們相互之間在
比較高級的功能例如外部連接,內(nèi)嵌過程等方面并不一致,盡
管我們能夠盼望著隨時間的推移這些部分的SQL可以獲得標準
化。同時我們采取這樣的態(tài)度與立場:
In fact, an application query need not even be SQL, or it may be a
specialized derivative of SQL, e.g. for document or image queries,
designed for specific DBMSs. In order to pass JDBC compliance tests and to be
called "JDBC
COMPLIANT ? we require that a driver support at least ANSI
SQL-2 Entry Level. This gives applications that want wide
portability a guaranteed least common denominator. We believe
ANSI SQL-2 Entry Level is reasonably powerful and is reasonably
widely supported today.
l JDBC允許查詢表達式直接傳遞到底層的數(shù)據(jù)驅(qū)動,這樣一
個程序可以獲得盡量多的SQL功能,但是可能被DBMS拒
絕。事實上,一個程序的查詢甚至可以不是SQL的,或者
是SQL的一個特殊演化,例如:為專門數(shù)據(jù)庫設(shè)計的文本
或者圖形查詢。
l 為了通過JDBC兼容的測試,并且能夠被稱為JDBC兼容,
我們要求一個驅(qū)動至少支持ANSI SQL-2的標準。這使得那
些需要廣泛移植性的程序獲得一個最小的分母(這句話的原
文是:This gives applications that want wide portability a
guaranteed least common denominator.)。我們相信ANSI
SQL-2是足夠強大的,并且是得到足夠支持的。
--
※ 來源:.華南網(wǎng)木棉站 bbs.gznet.edu.cn.[FROM: 202.38.240.203]
--------------------------------------------------------------------------------
[返回首頁] [討論區(qū)]
發(fā)信人: yeal (破光盤), 信區(qū): JAVA
標 題: JDBC(3)
發(fā)信站: 華南網(wǎng)木棉站 (Mon Feb 1 00:04:36 1999), 轉(zhuǎn)信
2.3. JDBC必須可以建立在現(xiàn)有的數(shù)據(jù)庫接口上
我們必須能夠保證 JDBC SQL API 能夠建立在普通的SQL
API上,尤其是ODBC。這些要求已經(jīng)對這個規(guī)范的一些部分
產(chǎn)生了影響,尤其是對傳出參數(shù)(OUT parameter)和大數(shù)據(jù)塊的
處理。
2.4. 必須保證這個接口與JAVA系統(tǒng)的其他部分保持一致
目前對JAVA的積極回應(yīng)已經(jīng)十分熱烈。很大程度上是由于這
個語言標準以及標準運行時庫被認為是一致,簡單和強大的。
我們將盡我們所能,提供這個Java數(shù)據(jù)庫接口,這個接口將建
我們希望普通的任務(wù)能夠是簡單的,而不一般的工作是可行
的。
一個普通任務(wù)是指一個程序員執(zhí)行一個簡單的沒有參數(shù)的SQL
語句(例如:SELECT,INSERT,UPDATE,DELETE),然后(例如
SELECT)處理返回的具有簡單類型的元組。一個具有傳入?yún)?shù)
(IN parameter)的SQL語句也是普通的。
不那么普通但是也是十分重要的情形是當(dāng)程序員使用有
INOUT,OUT參數(shù)的SQL語句。我們也需要支持讀寫幾兆字節(jié)
對象的SQL語句,更特別一些的情形包括一個語句返回了多個
結(jié)果集合。
我們希望元數(shù)據(jù)(Meatdata)的使用很少的,只是那些熟練的程序
員以及開發(fā)工具才需要處理的問題。元數(shù)據(jù)存取函數(shù)以及動態(tài)
類型數(shù)據(jù)存取函數(shù)在這個文檔末尾,一般的程序員可以不必關(guān)
心這些章節(jié)。
2.8. 不同的功能讓不同的方法(函數(shù))來實現(xiàn)
(“方法”的原文是:method,這樣翻譯是跟VB的)
一種界面設(shè)計風(fēng)格是使用很少的過程,提供許多作為參數(shù)傳遞
的控制標志,這樣它們可以用來影響很大一個范圍內(nèi)的各種行
為。來表達不同的功能。這趨向與使用很多的方法,但是每個
方法都比較同意理解。
一般來說,Java內(nèi)核類使用不同的方法(method)。這個步
驟的主要優(yōu)點是開始學(xué)習(xí)基本界面的程序員可以不必被那些與
復(fù)雜功能相關(guān)的參數(shù)所困擾。我們力圖在JDBC接口上也采用
相同的策略。一般來說采用不同的方法而不是采用不同的標志
和多用途的方法。
--
※ 來源:.華南網(wǎng)木棉站 bbs.gznet.edu.cn.[FROM: 202.38.240.203]
--------------------------------------------------------------------------------
[返回首頁] [討論區(qū)]
發(fā)信人: yeal (破光盤), 信區(qū): JAVA
標 題: JDBC(4)
發(fā)信站: 華南網(wǎng)木棉站 (Mon Feb 1 00:05:20 1999), 轉(zhuǎn)信
3. 接口概貌
接口分為兩個層次,一個是面向程序開發(fā)人員的JDBC API?
另外一個是底層的JDBC Driver API。
3.1. JDBC API
JDBC API 被描述成為彝族抽象的Java接口,似的應(yīng)用程序遠
可以對某個數(shù)據(jù)庫打開連接,執(zhí)行SQL語句并且處理結(jié)果?
錯誤! 嵌入對象無效。
最重要的接口是:
l java.sql.DriverManager
處理驅(qū)動的調(diào)入并且對產(chǎn)生新的數(shù)據(jù)庫連接提供支持。
l java.sql.Connection
代表對特定數(shù)據(jù)庫的連接
l java.sql.Statement
代表一個特定的容器,來對一個特定的數(shù)據(jù)庫執(zhí)行SQL語句。
l java.sql.ResultSet
控制對一個特定語句的行數(shù)據(jù)的存取
其中 java.sql.Statement 又有兩個子類型:
1. java.sql.PreparedStatement
用于執(zhí)行預(yù)編譯的SQL語句。
2. java.sql.CallableStatement
用于執(zhí)行對一個數(shù)據(jù)庫。
typical use scenarios is help-ful. There are two common scenarios
that must be treated differently for our purposes: applets and
applications.
在看JDBC API之前了解一下典型的使用場合是有幫助的。通
常有兩種情形必須分別對待:applet和application.
--
※ 來源:.華南網(wǎng)木棉站 bbs.gznet.edu.cn.[FROM: 202.38.240.203]
--------------------------------------------------------------------------------
[返回首頁] [討論區(qū)]
發(fā)信人: yeal (破光盤), 信區(qū): JAVA
標 題: JDBC(5)
發(fā)信站: 華南網(wǎng)木棉站 (Mon Feb 1 00:05:48 1999), 轉(zhuǎn)信
4.1. Applet
目前Java使用的最多的從網(wǎng)絡(luò)中下載的applet,它們作為web文
件的一個部分。當(dāng)中有數(shù)據(jù)庫存取applet和能夠使用JDBC來接
觸數(shù)據(jù)庫的applet。
例如,一個用戶可能下載一個顯示股票歷史價格圖的applet。這
個applet通過internet來從關(guān)系數(shù)據(jù)庫中獲得股票歷史價格。
最一般的情況里面,對applet的使用是通過不可靠的邊界的。例
如從另外一個公司或者Internet上獲得這些applet。于是稱這個情
況為"Internet"場合。然而applet也可能通過局域網(wǎng)下載。在這個
情況里面,客戶機的安全都還是一個問題。
典型的applet在幾個方面與傳統(tǒng)的數(shù)據(jù)庫應(yīng)用程序有所不同:
1. 不可靠的applet被嚴格地限制在他們被允許執(zhí)行的的操作
上。特別地,不允許他們存取本地的文件,切不允許他們對
任意的數(shù)據(jù)庫建立網(wǎng)絡(luò)連接。
2. 就標識和連接網(wǎng)上數(shù)據(jù)庫來說,Internet環(huán)境里面的applet面
臨新的問題。
3. 當(dāng)數(shù)據(jù)庫可能與你相隔萬里的時候,效率的考慮也有所不同
了。與局域網(wǎng)相比,Internet上數(shù)據(jù)庫applet可能會碰到十分
不同的反應(yīng)時間。
4.2. Application
Java也可以用來建立普通的應(yīng)用,從而想一般的應(yīng)用一樣在客
戶機上使用。我們相信隨著開發(fā)工具越來越多,人們開始認識
到提高程序生產(chǎn)效率的必要性,以及Java的其他優(yōu)點,Java的
這種用法將越來越流行。在這種方式里面,Java的代碼是可以
信賴的,且被允許讀寫文件打開網(wǎng)絡(luò)連接等等,就想其他的應(yīng)
用程序代碼一樣。
也許這些Java應(yīng)用使用的最多的是在一個公司內(nèi)部或者在
Intranet上,所以不妨成為Intranet場合。例如一個公司希望利用
Java及其GUI構(gòu)件工具來建立他的基于合作數(shù)據(jù)模式的合作軟
件。這些應(yīng)用程序?qū)⒋嫒【钟蚓W(wǎng)或者廣域網(wǎng)的數(shù)據(jù)。Java應(yīng)用
可以作到這些。
Java應(yīng)用程序場合和Intranet場合與applet場合有諸多不同。例如
標定一個數(shù)據(jù)庫最自然的方式是用一個數(shù)據(jù)庫的名字,就象
"Customers" 和"Personnel"這樣。然后用戶希望系統(tǒng)能夠定位具
體的機器,DBMS,JDBC driver,和Java應(yīng)用程序。
--
※ 來源:.華南網(wǎng)木棉站 bbs.gznet.edu.cn.[FROM: 202.38.240.203]
--------------------------------------------------------------------------------
[返回首頁] [討論區(qū)]發(fā)信人: yeal (破光盤), 信區(qū): JAVA
標 題: JDBC(6)
發(fā)信站: 華南網(wǎng)木棉站 (Mon Feb 1 00:06:10 1999), 轉(zhuǎn)信
4.3. 其他場合
還有其他一些有趣的場合:
1. 已驗證的applet(Trusted applets)是指那些已經(jīng)被Java虛擬
機器認定是可以信賴的applet。他們之所以被認為是可信的
是因為他們已經(jīng)對上了特定的密匙,或者用戶認為從特定來
源來的applet是可信的。在安全的方面上他們與應(yīng)用
(appliction)相同,但是其他方面(例如定位一個數(shù)據(jù)庫)
與則與applet相似。
2. 與直接從Java GUI出發(fā)用客戶/服務(wù)器模式來度曲DBMS服
務(wù)器不同,三層存取方式可能被使用。在這個場合里面,Java
應(yīng)用程序?qū)χ虚g層的服務(wù)發(fā)出調(diào)用,中間層的服務(wù)在網(wǎng)上,
它又再去調(diào)用數(shù)據(jù)庫。這些調(diào)用可能通過RPC (remote
procedure call)或者ORB (object request broker )。在這兩種場
合里面,中間層最好使用一個對象變化。我們希望三層結(jié)構(gòu)
會變得越來越普遍,因為對于MIS管理者來說,這可以使得
他們有機會在公共數(shù)據(jù)庫上顯式地定義合法操作等。同時三
層結(jié)構(gòu)可以提供許多效率上的好處。
目前
中間層一般用C或者C++這樣的語言來完成。通過優(yōu)化編譯
器把把Java 字節(jié)代碼翻譯成為高效的機器代碼,中間層也
可以用Java來實現(xiàn)。Java有許多優(yōu)良特性(健壯性,安全性,
多線程)可以達到中間層需要達到的目的。
--
※ 來源:.華南網(wǎng)木棉站 bbs.gznet.edu.cn.[FROM: 202.38.240.203]
--------------------------------------------------------------------------------
[返回首頁] [討論區(qū)]
發(fā)信人: yeal (破光盤), 信區(qū): JAVA
標 題: JDBC(7)
發(fā)信站: 華南網(wǎng)木棉站 (Mon Feb 1 00:07:01 1999), 轉(zhuǎn)信
5. 安全性考慮
作為網(wǎng)絡(luò)上的語言JAVA必須十分注安全性的考慮。基于上面
的討論,JDBC的兩種主要使用場合里面,我們必須考慮安全性
問題:
l 在Java applications的場合里面Java代碼是本地的,所以也是
"trusted"
l 沒有驗證的Java applet代碼不可以存取本地的以及其他網(wǎng)絡(luò)
的數(shù)據(jù)。
5.1. JDBC 和未驗證的applet
JDBC首先必須符合JAVA的一般安全規(guī)則。另外:
l JDBC 必須認為沒有驗證的applets是不可靠的。
l JDBC 不可以讓不可靠的applets存取本地數(shù)據(jù)庫。
l 一個已經(jīng)向JDBC DriverManager注冊的是JDBC Driver只能
存取它所來的數(shù)據(jù)源。
l 一個applet也只能向它所Download來的服務(wù)器來存取數(shù)據(jù)。
如果JDBC驅(qū)動層如果完全確信對一個數(shù)據(jù)庫服務(wù)器打開連接
不會引起認證或者權(quán)限問題(可能由網(wǎng)上隨機主機上運行的程
序引起),那么它就允許applet打開這樣的連接。數(shù)據(jù)庫服務(wù)器
不通過IP地址來限制存取是相當(dāng)少的,主要是為了舉例。(當(dāng)
心,這一段話我可能翻譯反了。!大家看看原文。)
這些限制是相當(dāng)煩瑣的。不過他們與對一般applet的限制是一
致的我們沒有必要放開這些限制。
5.2. JDBC 和Java應(yīng)用程序
對于一個普通的Java應(yīng)用程序(例如全部用Java代碼而不是不
但是如果一個JDBC驅(qū)動試圖在多個數(shù)據(jù)庫連接之間共享一個
TCP連接,那么驅(qū)動就必須自己負責(zé)檢查每個調(diào)用者是否真的
被允許與目標數(shù)據(jù)庫聯(lián)系。例如如果我們?yōu)閍pplet A打開了一個
通往機器foobah 的TCP連接,這并不意味著applet B被自動允許
來共享這個連接。applet B可能沒有任何訪問機器foobah的權(quán)
力。所以在允許某個程序重用一個現(xiàn)成的TCP連接之前,JDBC
驅(qū)動必須通過安全機構(gòu)來檢查當(dāng)前的的調(diào)用者是否可以訪問這
個連接。通過下面的代碼可是實現(xiàn)這個功能。
SecurityManager security = System.getSecurityManager();
if (security != null)
{
security.checkConnect(hostName, portNumber);
}
如果連接是不允許的,那么Security.checkConnect方法將產(chǎn)生一
個java.lang.SecurityException。
--
※ 來源:.華南網(wǎng)木棉站 bbs.gznet.edu.cn.[FROM: 202.38.240.203]
--------------------------------------------------------------------------------
[返回首頁] [討論區(qū)]
發(fā)信人: yeal (破光盤), 信區(qū): JAVA
標 題: JDBC(8)
發(fā)信站: 華南網(wǎng)木棉站 (Mon Feb 1 00:07:22 1999), 轉(zhuǎn)信
5.3.2. 檢查所有的本地文件訪問
如果一個JDBC取得需要訪問本地機器上的數(shù)據(jù),那么他必須確
信調(diào)用者是被允許打開這個文件的。例如:
SecurityManager security = System.getSecurityManager();
if (security != null)
{
security.checkRead(fileName);
}
如果對特定文件的訪問是不允許的,那么Security.checkRead方
法將產(chǎn)生一個java.lang.SecurityException。
5.3.3. 作好最壞的準備
一些驅(qū)動可能使用本地的方法來橋接底層數(shù)據(jù)庫程序。則這些
情況里面判斷那些本地文件將被底層函數(shù)所訪問是困難的。
在這些環(huán)境里面用戶必須作好最壞的打算,并且否決所有下載
applet所發(fā)出的數(shù)據(jù)庫存取,除非驅(qū)動可能完全確信將要做存取
是沒有問題的。
例如一個JDBC-ODBC橋接器必須檢查ODBC數(shù)據(jù)源的的名
稱,確保applet只可以訪問它的“生源地”。如果對有的名字中
不能判斷出數(shù)據(jù)源的主機名,那么只能否決這個訪問。
為了決定一個當(dāng)前的調(diào)用者是可以信賴的應(yīng)用還是一個
applet,JDBC驅(qū)動必須能夠檢查這個調(diào)用者是否可以寫一個隨
機的文件:
SecurityManager security = System.getSecurityManager();
if (security != null)
{
security.checkWrite("foobaz");
I. }