JDBC技術說明
發表時間:2024-06-11 來源:明輝站整理相關軟件相關文章人氣:
[摘要]1. 介 紹 Java 許多開發者和用戶都在尋找程Java序中訪問數據庫的便捷方法。由于是download 一個健壯,安全,易于使用的,易于理解且可以從網絡中自動,C所以它成為開發數據庫應用的一種良好的語言基礎。它提供了,C+Smalltalk+,, BASIC, COBOL, and 4GL...
1. 介 紹 Java
許多開發者和用戶都在尋找程Java序中訪問數據庫的便捷方法。由于是download 一個健壯,安全,易于使用的,易于理解且可以從網絡中自動,C所以它成為開發數據庫應用的一種良好的語言基礎。它提供了,C+Smalltalk+,, BASIC, COBOL, and 4GLs的Java許多優點。許多公司已經開始在與DBMS的 連接方面做工作。 Java
許多應DBMS用開發者都希望能夠編寫獨立于特定的DBMS程序,而我們也相信一個獨立于的DBMS接口將使得與各種各樣連SQL接變得最為便捷,開發更加迅速。所以我們認為定義一個通用的數Java據庫存取框架,在各種各樣的提供數據庫連接模塊上提供統一的界面是十分有意義的。這使程序員可以面對單一的數據庫界面,使數據庫無關的工SQL具和產品成為可能,使得數據庫連接的開發者可以提供各種各樣的連接方案。我們看到我們定義一個通用低層的,支持基本功JavaDataBase Connectivity 能的(JDBC)API的 緊迫任務。 SQL API
幸運的是我們不必從頭設計一個。 X我們可以把我們的工作建立在/Open SQL CLI (Microsoft調用層接口)之上(它也是's ODBC 的 基礎)。 Java
我們主要任務是定義一個自然的接X口來與/Open CLI中 定義的基本的抽象層和概念連接。 JDBC API
得ISV到數據庫開發廠商,連接開發廠商,,ODBC以及應用開發者的支持是十分重要的。我們相信把我們的工作建立在抽JDBC象層的基礎上將更ODBC加容易得到大家的接受。而且從技術上來說,是 我們設計工作的一個良好基礎。 ODBC
因為是C一個語ODBC言接口,所以在Java中Java直接使用不適當。從中C來調用代Java碼在安全性,健壯性,實現的方便,可移植性等等方面有許多不便。它使得在 這些方面的許多優點得不到發揮。 ODBC
我們已經在短期里面實現了一個建立在上API的。 長遠來看,我們可以通過其他方式提供實現。 1. 1.
注 意 JDBC
我們非常感謝在數據庫,數據庫連接和數據庫工具領域的許多早期的工作者。他們為的 早期草案提供了很好的意見和建議。他們的工作對本規范起了不可估量的作用。
2.
目 標與哲學 API
這個部分描述了指引這個開 發的目標以及哲學。 2. 1. SQL
級 API Java
我們的主要目標是為定call-level義一個"調用級”()SQL的接SQL口。著意味著我們主要的注意力集中在執行原原本本的語API句并且取回結果。我們預計高層的也 將被定義,這些可能將建立在基層的接口上。 Java
這些高層接口包括象直接地、透明地把表里面的數據影射到類Java里面,用語法樹表示更加通用的查詢,以及內SQL嵌的語 法。 API
我們希望大量的應用開發工具將使用我們的。API然而我們也希望程序員能夠使用我們的,Java尤其是目前這樣在里 沒有任何其他手段(應該是說數據庫訪問手段)的情況下。 2. 2.
遵SQL 循 SQL
數據庫系統支持各式各樣的語SQL法和語義,它們相互之間在比較高級的功能例如外部連接,內嵌過程等方面并不一致,盡管我們能夠盼望著隨時間的推移這些部分的可 以獲得標準化。同時我們采取這樣的態度與立場: 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. * JDBC
允SQL許查詢表達式直接傳遞到底層的數據驅動,這樣一個程序可以獲得盡量多的功DBMS能,但是可能被拒SQL絕。事實上,一個程序的查詢甚至可以不是的SQL,或者是的 一個特殊演化,例如:為專門數據庫設計的文本或者圖形查詢。 *
為JDBC了通過兼JDBC容的測試,并且能夠被稱為兼ANSI SQL-2容,我們要求一個驅動至少支持的This gives applications that want wide portability a guaranteed least common denominator.標準。這使得那些需要廣泛移植性的程序獲得一個最小的分母(這句話的原文是:)ANSI SQL-2。我們相信是 足夠強大的,并且是得到足夠支持的。 2. 3. JDBC
必 須可以建立在現有的數據庫接口上 JDBC SQL API
我們必須能夠保證能SQL API夠建立在普通的上ODBC,尤其是。OUT parameter這些要求已經對這個規范的一些部分產生了影響,尤其是對傳出參數() 和大數據塊的處理。 2. 4.
必JAVA須保證這個接口與系 統的其他部分保持一致 JAVA
目前對的Java積極回應已經十分熱烈。很大程度上是由于這個語言標準以及標準運行時庫被認為是一致,簡單和強大的。我們將盡我們所能,提供這個數Java據庫接口,這個接口將建立在內 核現有的這種風格,并且將進一步加強它。 2. 5.
保 持簡單 We would prefer to keep this base API as simple as possible
, at least initially. In general we would prefer to provide a single mechanism for performing a particular task, and avoid provid-ing duplicate mechanisms. We will extend the API later if any important functionality is miss-ing. API
我們將力爭使得基本的盡API量簡單,至少開始的時候是這樣的。一般來說,我們希望對實現每個特定的任務只提供一種方案,而避免提供多種方案。如果一些重要的功能遺漏了,那么我們在晚些時候將擴充這個。 2. 6.
盡 量保持強的、靜態的類型 JDBC API
我們希望這個保 持盡量強的類型檢查,使得盡可能多的類型信息可以靜態地表達。著使得盡可能多的錯誤可以在編譯的時候被發現。 SQL
由于本SELECT身是動態類型的,所以我們可能會在程序運行的時候遇到類型不能匹配的問題。例如:當一個程序員在希望返foo回一個整數,但是實際返回的是一個字符串"”. 但 是我們依然希望程序員把他們所希望的類型在編譯的時候就能夠表達清楚,這樣我們可以做盡可能多的靜態檢查。我們也希望在必要的時候能夠支持動態類型接口(見第四章) 2. 7.
使 普通任務簡化
我們希望普通的任務能夠是簡單的,而不一般的工作是可行的。 SQL
一個普通任務是指一個程序員執行一個簡單的沒有參數的語SELECT句(例如:,INSERT,UPDATE,DELETE)SELECT,然后(例如)IN parameter處理返回的具有簡單類型的元組。一個具有傳入參數()SQL的語 句也是普通的。 INOUT
不那么普通但是也是十分重要的情形是當程序員使用有,OUT參SQL數的語SQL句。我們也需要支持讀寫幾兆字節對象的語 句,更特別一些的情形包括一個語句返回了多個結果集合。 Meatdata
我們希望元數據() 的使用很少的,只是那些熟練的程序員以及開發工具才需要處理的問題。元數據存取函數以及動態類型數據存取函數在這個文檔末尾,一般的程序員可以不必關心這些章節。 2. 8.
不method同的功能讓不同的方法(函數)來實現("方法”的原文是:,VB這樣翻譯是跟的 )
一種界面設計風格是使用很少的過程,提供許多作為參數傳遞的控制標志,這樣它們可以用來影響很大一個范圍內的各種行為。來表達不同的功能。這趨向與使用很多的方法,但是每個方法都比較同意理解。 Java
一般來說,內method核類使用不同的方法()JDBC。這個步驟的主要優點是開始學習基本界面的程序員可以不必被那些與復雜功能相關的參數所困擾。我們力圖在接 口上也采用相同的策略。一般來說采用不同的方法而不是采用不同的標志和多用途的方法。 3.
接 口概貌 JDBC API
接口分為兩個層次,一個是面向程序開發人員的。JDBC Driver API另外一個是底層的。 3. 1. JDBC API
JDBC API
被Java描述成為彝族抽象的接SQL口,似的應用程序遠可以對某個數據庫打開連接,執行語 句并且處理結果。最重要的接口是: * java.sql.DriverManager
處 理驅動的調入并且對產生新的數據庫連接提供支持。 * java.sql.Connection
代 表對特定數據庫的連接。 * java.sql.Statement
SQL代表一個特定的容器,來對一個特定的數據庫執行語 句。 * java.sql.ResultSet
控制對一個特定語句的行數據的存取。 java.sql.Statement
其中又 有兩個子類型: 1. java.sql.PreparedStatement
SQL用于執行預編譯的語 句。 2. java.sql.CallableStatement
用于執行對一個數據庫內嵌過程的調用。 JDBC
下面的章節對是13如何運行的提供了更多描述,整個定義見第章15。另外第章 描述了系統如果獲取數據庫的元數據信息。 3. 2. JDBC Driver API
java.sql.Driver
在9第章.有完整的定義了大JDBC部分驅JDBC API動只需要完成這些所driver定義的抽象類就可以了。特別地,所有的必java.sql.Connection須提供對, java.sql. State-ment, java.sql.Prepared-Statement, and java.sql.ResultSet的DBMS實現。如果目標提OUT供有參java.sql.CallableStatement 數的內嵌過程,那么還必須提供接 口。每database driver個必java.sql.Driver須提供一個類:以 java.sql.DriverManager使得系統可以由來 管理。 driver
一個顯然的是ODBC在之JDBC上提供對的ODBC實現,從而提供與接JDBC-ODBC 口的橋.,就象前面的圖所顯示的由JDBC于放ODBC在之 后,所以實現起來簡單而且高效。 ODBC
另外一個有用的驅動直接接觸數據庫無關的網絡協議。發布一個協議允許多個服務器實現的方法,例如在或DBMS者特定的上 (盡管已經有了一些使用固定協議的產品,但是我們不打算對它們實現標準化。),是可取的。
4. JDBC
使 用場合 Before looking at specifics of the JDBC API
, an understanding of 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. 4. 1. Applet
Java
目前使applet用的最多的從網絡中下載的,web它們作為文applet件的一個部分。當中有數據庫存取和JDBC能夠使用來applet接觸數據庫的。applet例如,一個用戶可能下載一個顯示股票歷史價格圖的。applet這個通internet過來 從關系數據庫中獲得股票歷史價格。 applet
最一般的情況里面,對的Internet使用是通過不可靠的邊界的。例如從另外一個公司或者上applet獲得這些。Internet于是稱這個情況為""applet場合。然而也 可能通過局域網下載。在這個情況里面,客戶機的安全都還是一個問題。 applet
典型的在 幾個方面與傳統的數據庫應用程序有所不同: 1
). 不applet可靠的被 嚴格地限制在他們被允許執行的的操作上。特別地,不允許他們存取本地的文件,切不允許他們對任意的數據庫建立網絡連接。 2
). 就Internet標識和連接網上數據庫來說,環applet境里面的面 臨新的問題。 3
). 當Internet數據庫可能與你相隔萬里的時候,效率的考慮也有所不同了。與局域網相比,上applet數據庫可 能會碰到十分不同的反應時間。 4. 2. Application
Java
也Java可以用來建立普通的應用,從而想一般的應用一樣在客戶機上使用。我們相信隨著開發工具越來越多,人們開始認識到提高程序生產效率的必要性,以及的Java其他優點,的Java這種用法將越來越流行。在這種方式里面,的 代碼是可以信賴的,且被允許讀寫文件打開網絡連接等等,就想其他的應用程序代碼一樣。 Java
也許這些應Intranet用使用的最多的是在一個公司內部或者在上Intranet,所以不妨成為場Java合。例如一個公司希望利用及GUI其構Java件工具來建立他的基于合作數據模式的合作軟件。這些應用程序將存取局域網或者廣域網的數據。應 用可以作到這些。 Java
應Intranet用程序場合和場applet合與場Customers合有諸多不同。例如標定一個數據庫最自然的方式是用一個數據庫的名字,就象"" 和Personnel""DBMS這樣。然后用戶希望系統能夠定位具體的機器,,JDBC driver,Java和應 用程序。 4. 3.
其 他場合
還有其他一些有趣的場合: 1
). 已applet驗證的(Trusted applets)Java是指那些已經被虛applet擬機器認定是可以信賴的。applet他們之所以被認為是可信的是因為他們已經對上了特定的密匙,或者用戶認為從特定來源來的是appliction可信的。在安全的方面上他們與應用()applet相同,但是其他方面(例如定位一個數據庫)與則與相 似。 2
). 與Java GUI直接從出DBMS發用客戶/服務器模式來度曲服Java務器不同,三層存取方式可能被使用。在這個場合里面,應RPC 用程序對中間層的服務發出調用,中間層的服務在網上,它又再去調用數據庫。這些調用可能通過(remote procedure call)ORB 或者(object request broker )MIS。在這兩種場合里面,中間層最好使用一個對象變化。我們希望三層結構會變得越來越普遍,因為對于管 理者來說,這可以使得他們有機會在公共數據庫上顯式地定義合法操作等。同時三層結構可以提供許多效率上的好處。 C
目前中間層一般用或C者+Java +這樣的語言來完成。通過優化編譯器把把字Java節代碼翻譯成為高效的機器代碼,中間層也可以用來Java實現。有 許多優良特性(健壯性,安全性,多線程)可以達到中間層需要達到的目的。
5.
安 全性考慮 JAVA
作為網絡上的語言必JDBC須十分注安全性的考慮。基于上面的討論,的 兩種主要使用場合里面,我們必須考慮安全性問題: *
在Java applications的Java場合里面代trusted碼是本地的,所以也是"" *
沒Java applet有驗證的代 碼不可以存取本地的以及其他網絡的數據。 5. 1. JDBC
和applet 未驗證的 JDBC
首JAVA先必須符合的 一般安全規則。另外: * JDBC
必applets須認為沒有驗證的是 不可靠的。 * JDBC
不applets可以讓不可靠的存 取本地數據庫。 *
一JDBC DriverManager個已經向注JDBC Driver冊的是只 能存取它所來的數據源。 *
一applet個也Download只能向它所來 的服務器來存取數據。 JDBC
如果驅applet動層如果完全確信對一個數據庫服務器打開連接不會引起認證或者權限問題(可能由網上隨機主機上運行的程序引起),那么它就允許打IP開這樣的連接。數據庫服務器不通過地applet址來限制存取是相當少的,主要是為了舉例。(當心,這一段話我可能翻譯反了!!!大家看看原文。)這些限制是相當煩瑣的。不過他們與對一般的 限制是一致的我們沒有必要放開這些限制。 5. 2. JDBC
和Java應 用程序 Java
對于一個普通的應Java用程序(例如全部用代applet 碼而不是不可靠的)JDBC將 從本地的類路徑里面獲得驅動,并且允許應用程序自由存取文件,遠程服務器等等。 applet
但是和一sun.sql.Driver樣,如果由于某些原因一個沒有驗證的類 從遠程的來源里面獲得,那么這個驅動只能和相同地方來的代碼配合。 5. 3. Driver
的 安全責任 JDBC driver
可applet能在各種情況下使用,所以驅動的編制者遵循一定的簡單的安全規則,從而避免做 非法的數據庫連接。 applet
如果所有的驅動都象一Java樣從網上下載,那么這些原則將是不必要的,因為普通的安全規則已經對它做了限制。但是驅動的編寫者必須記住一旦他們的驅動獲得成功,用戶將在本地磁盤安裝這些驅動,那么驅動將成為環applet境中一個被信任的部分,所以必須確信它不會被來訪的所 濫用。所以我們鼓勵所有的驅動編寫者必須遵循一定安全原則。
所有這些原則都是在連接打開的時候使用。這正式驅動和虛擬機器檢查當前調用者是否真的可以與指定的數據庫連接的時刻。一旦連接建立就不必做更多的檢查了。 5. 3. 1.
分TCP享/IP連 接的時候必須謹慎 JDBC 如果一個驅 TCP 動試圖打開一個連Java 接,那么這個打開會被安applet全管理機制自動檢查。這個機構會檢查當前調用棧里面有沒有,JDBC如果有那么就限定它可以訪問的機器集合。所以一般地驅TCP動可以把建Java立檢查留給虛 擬機。 JDBC
但是如果一個驅TCP動試圖在多個數據庫連接之間共享一個連applet A接,那么驅動就必須自己負責檢查每個調用者是否真的被允許與目標數據庫聯系。例如如果我們為打foobah 開了一個通往機器的TCP連applet B接,這并不意味著被applet B自動允許來共享這個連接。可foobah能沒有任何訪問機器的TCP權力。所以在允許某個程序重用一個現成的連JDBC 接之前,驅 動必須通過安全機構來檢查當前的的調用者是否可以訪問這個連接。通過下面的代碼可是實現這個功能。 SecurityManager security
= System.getSecurityManager( ); if
(security ! null=)
{ security.checkConnect
(hostName, portNumber) ;
} Security.checkConnect
如果連接是不允許的,那么方java.lang.SecurityException法將產生一個。 5. 3. 2. 檢 查所有的本地文件訪問 JDBC
如果一個取 得需要訪問本地機器上的數據,那么他必須確信調用者是被允許打開這個文件的。例如: SecurityManager security
= System.getSecurityManager( ); if
(security ! null=)
{ security.checkRead
(fileName) ;
} Security.checkRead
如果對特定文件的訪問是不允許的,那么方java.lang.SecurityException法將產生一個。 5. 3. 3.
作 好最壞的準備
一些驅動可能使用本地的方法來橋接底層數據庫程序。則這些情況里面判斷那些本地文件將被底層函數所訪問是困難的。 applet
在這些環境里面用戶必須作好最壞的打算,并且否決所有下載所 發出的數據庫存取,除非驅動可能完全確信將要做存取是沒有問題的。 JDBC-ODBC
例如一個橋ODBC接器必須檢查數applet據源的的名稱,確保只 可以訪問它的"生源地"。如果對有的名字中不能判斷出數據源的主機名,那么只能否決這個訪問。 applet
為了決定一個當前的調用者是可以信賴的應用還是一個,JDBC驅 動必須能夠檢查這個調用者是否可以寫一個隨機的文件: SecurityManager security
= System.getSecurityManager( ); if
(security ! null=)
{ security.checkWrite
(foobaz"" ); I.
}