JDBC專題介紹
Ref:
http://kb.csdn.net/java/Articles/200506/73344a78-6148-475b-b42f-ab03f95e95a8.html
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功能的JavaDataBase?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ī)范起了不可估量的作用。?
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.
*?JDBC允許查詢表達式直接傳遞到底層的數(shù)據(jù)驅(qū)動,這樣一個程序可以獲得盡量多的SQL功能,但是可能被DBMS拒絕。事實上,一個程序的查詢甚至可以不是SQL的,或者是SQL的一個特殊演化,例如:為專門數(shù)據(jù)庫設(shè)計的文本或者圖形查詢。
*?為了通過JDBC兼容的測試,并且能夠被稱為JDBC兼容,我們要求一個驅(qū)動至少支持ANSI?SQL-2的標準。這使得那些需要廣泛移植性的程序獲得一個最小的分母(這句話的原文是:This?gives?applications?that?want?wide?portability?a?guaranteed?least?common?denominator.)。我們相信ANSI?SQL-2是足夠強大的,并且是得到足夠支持的。
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ù)庫接口,這個接口將建立在Java內(nèi)核現(xiàn)有的這種風(fēng)格,并且將進一步加強它。
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盡量簡單,至少開始的時候是這樣的。一般來說,我們希望對實現(xiàn)每個特定的任務(wù)只提供一種方案,而避免提供多種方案。如果一些重要的功能遺漏了,那么我們在晚些時候?qū)U充這個API。
2.?6.?盡量保持強的、靜態(tài)的類型
我們希望這個JDBC?API保持盡量強的類型檢查,使得盡可能多的類型信息可以靜態(tài)地表達。著使得盡可能多的錯誤可以在編譯的時候被發(fā)現(xiàn)。
由于SQL本身是動態(tài)類型的,所以我們可能會在程序運行的時候遇到類型不能匹配的問題。例如:當(dāng)一個程序員在希望SELECT返回一個整數(shù),但是實際返回的是一個字符串“foo”.?但是我們依然希望程序員把他們所希望的類型在編譯的時候就能夠表達清楚,這樣我們可以做盡可能多的靜態(tài)檢查。我們也希望在必要的時候能夠支持動態(tài)類型接口(見第四章)
2.?7.?使普通任務(wù)簡化
我們希望普通的任務(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接口上也采用相同的策略。一般來說采用不同的方法而不是采用不同的標志和多用途的方法。
3.?接口概貌
接口分為兩個層次,一個是面向程序開發(fā)人員的JDBC?API。另外一個是底層的JDBC?Driver?API。
3.?1.?JDBC?API
JDBC?API?被描述成為彝族抽象的Java接口,似的應(yīng)用程序遠可以對某個數(shù)據(jù)庫打開連接,執(zhí)行SQL語句并且處理結(jié)果。最重要的接口是:
*?java.sql.DriverManager?處理驅(qū)動的調(diào)入并且對產(chǎn)生新的數(shù)據(jù)庫連接提供支持。
*?java.sql.Connection?代表對特定數(shù)據(jù)庫的連接。
*?java.sql.Statement? 代表一個特定的容器,來對一個特定的數(shù)據(jù)庫執(zhí)行SQL語句。
*?java.sql.ResultSet? 控制對一個特定語句的行數(shù)據(jù)的存取。
其中java.sql.Statement又有兩個子類型:
1.?java.sql.PreparedStatement? 用于執(zhí)行預(yù)編譯的SQL語句。
2.?java.sql.CallableStatement? 用于執(zhí)行對一個數(shù)據(jù)庫內(nèi)嵌過程的調(diào)用。
下面的章節(jié)對JDBC是如何運行的提供了更多描述,整個定義見第13章。另外第15章描述了系統(tǒng)如果獲取數(shù)據(jù)庫的元數(shù)據(jù)信息。
3.?2.?JDBC?Driver?API
java.sql.Driver在第9章有完整的定義了.大部分JDBC驅(qū)動只需要完成這些JDBC?API所定義的抽象類就可以了。特別地,所有的driver必須提供對java.sql.Connection,?java.sql.?State-ment,?java.sql.Prepared-Statement,?and?java.sql.ResultSet的實現(xiàn)。如果目標DBMS提供有OUT參數(shù)的內(nèi)嵌過程,那么還必須提供java.sql.CallableStatement?接口。?每個database?driver必須提供一個類:java.sql.Driver以使得系統(tǒng)可以由?java.sql.DriverManager來管理。
一個顯然的driver是在ODBC之上提供對JDBC的實現(xiàn),從而提供與ODBC接口的JDBC-ODBC?橋,就象前面的圖所顯示的.由于JDBC放在ODBC之后,所以實現(xiàn)起來簡單而且高效。
另外一個有用的驅(qū)動直接接觸數(shù)據(jù)庫無關(guān)的網(wǎng)絡(luò)協(xié)議。發(fā)布一個協(xié)議允許多個服務(wù)器實現(xiàn)的方法,例如在ODBC或者特定的DBMS上(盡管已經(jīng)有了一些使用固定協(xié)議的產(chǎn)品,但是我們不打算對它們實現(xiàn)標準化。),是可取的。
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使用的最多的從網(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)用程序。
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)良特性(健壯性,安全性,多線程)可以達到中間層需要達到的目的。?
5.?安全性考慮
作為網(wǎng)絡(luò)上的語言JAVA必須十分注安全性的考慮。基于上面的討論,JDBC的兩種主要使用場合里面,我們必須考慮安全性問題:
*?在Java?applications的場合里面Java代碼是本地的,所以也是"trusted"?
*?沒有驗證的Java?applet代碼不可以存取本地的以及其他網(wǎng)絡(luò)的數(shù)據(jù)。
5.?1.?JDBC?和未驗證的applet
JDBC首先必須符合JAVA的一般安全規(guī)則。另外:
*?JDBC?必須認為沒有驗證的applets是不可靠的。
*?JDBC?不可以讓不可靠的applets存取本地數(shù)據(jù)庫。
*?一個已經(jīng)向JDBC?DriverManager注冊的是JDBC?Driver只能存取它所來的數(shù)據(jù)源。
*?一個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代碼而不是不可靠的applet?)JDBC將從本地的類路徑里面獲得驅(qū)動,并且允許應(yīng)用程序自由存取文件,遠程服務(wù)器等等。
但是和applet一樣,如果由于某些原因一個沒有驗證的sun.sql.Driver類從遠程的來源里面獲得,那么這個驅(qū)動只能和相同地方來的代碼配合。
5.?3.?Driver的安全責(zé)任
JDBC?driver可能在各種情況下使用,所以驅(qū)動的編制者遵循一定的簡單的安全規(guī)則,從而避免applet做非法的數(shù)據(jù)庫連接。
如果所有的驅(qū)動都象applet一樣從網(wǎng)上下載,那么這些原則將是不必要的,因為普通的安全規(guī)則已經(jīng)對它做了限制。但是驅(qū)動的編寫者必須記住一旦他們的驅(qū)動獲得成功,用戶將在本地磁盤安裝這些驅(qū)動,那么驅(qū)動將成為Java環(huán)境中一個被信任的部分,所以必須確信它不會被來訪的applet所濫用。所以我們鼓勵所有的驅(qū)動編寫者必須遵循一定安全原則。
所有這些原則都是在連接打開的時候使用。這正式驅(qū)動和虛擬機器檢查當(dāng)前調(diào)用者是否真的可以與指定的數(shù)據(jù)庫連接的時刻。一旦連接建立就不必做更多的檢查了。
5.?3.?1.?分享TCP/IP連接的時候必須謹慎? 如果一個JDBC驅(qū)動試圖打開一個?TCP?連接,那么這個打開會被Java?安全管理機制自動檢查。這個機構(gòu)會檢查當(dāng)前調(diào)用棧里面有沒有applet,如果有那么就限定它可以訪問的機器集合。所以一般地JDBC驅(qū)動可以把TCP建立檢查留給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。?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.?}?
)jconn2.jar
Class.forName( "com.sybase.jdbc2.jdbc.SybDriver" ); cn = DriverManager.getConnection( "jdbc:sybase:Tds:MyDbComputerNameOrIP:2638", sUsr, sPwd ); //(Default-Username/Password: "dba"/"sql")
5. Microsoft SQLServer(
http://jtds.sourceforge.net">
http://jtds.sourceforge.net)
Class.forName( "net.sourceforge.jtds.jdbc.Driver" ); cn = DriverManager.getConnection( "jdbc:jtds:sqlserver://MyDbComputerNameOrIP:1433/master", sUsr, sPwd );
6. Microsoft SQLServer(
http://www.microsoft.com)
Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" ); cn = DriverManager.getConnection( "jdbc:microsoft:sqlserver://MyDbComputerNameOrIP:1433;databaseName=master", sUsr, sPwd );
7. ODBC
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); Connection cn = DriverManager.getConnection( "jdbc:odbc:" + sDsn, sUsr, sPwd );
8.DB2
Class.forName("com.ibm.db2.jdbc.net.DB2Driver"); String url="jdbc:db2://192.9.200.108:6789/SAMPLE" cn = DriverManager.getConnection( url, sUsr, sPwd );
#?
JDBC連接數(shù)據(jù)庫經(jīng)驗技巧集萃
2005-11-20 19:51 Java數(shù)據(jù)庫連接(JDBC)由一組用 Java 編程語言編寫的類和接口組成。JDBC 為工具/數(shù)據(jù)庫開發(fā)人員提供了一個標準的 API,使他們能夠用純Java API 來編寫數(shù)據(jù)庫應(yīng)用程序。然而各個開發(fā)商的接口并不完全相同,所以開發(fā)環(huán)境的變化會帶來一定的配置變化。本文主要集合了不同數(shù)據(jù)庫的連接方式。
一、連接各種數(shù)據(jù)庫方式速查表
下面羅列了各種數(shù)據(jù)庫使用JDBC連接的方式,可以作為一個手冊使用。
1、Oracle8/8i/9i數(shù)據(jù)庫(thin模式)
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl為數(shù)據(jù)庫的SID
String user="test";
String password="test";
Connection conn= DriverManager.getConnection(url,user,password);
2、DB2數(shù)據(jù)庫
Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
String url="jdbc:db2://localhost:5000/sample"; //sample為你的數(shù)據(jù)庫名
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
3、Sql Server7.0/2000數(shù)據(jù)庫
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";
//mydb為數(shù)據(jù)庫
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
4、Sybase數(shù)據(jù)庫
Class.forName("com.sybase.jdbc.SybDriver").newInstance();
String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDB為你的數(shù)據(jù)庫名
Properties sysProps = System.getProperties();
SysProps.put("user","userid");
SysProps.put("password","user_password");
Connection conn= DriverManager.getConnection(url, SysProps);
5、Informix數(shù)據(jù)庫
Class.forName("com.informix.jdbc.IfxDriver").newInstance();
String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;
user=testuser;password=testpassword"; //myDB為數(shù)據(jù)庫名
Connection conn= DriverManager.getConnection(url);
6、MySQL數(shù)據(jù)庫
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//myDB為數(shù)據(jù)庫名
Connection conn= DriverManager.getConnection(url);
7、PostgreSQL數(shù)據(jù)庫
Class.forName("org.postgresql.Driver").newInstance();
String url ="jdbc:postgresql://localhost/myDB" //myDB為數(shù)據(jù)庫名
String user="myuser";
String password="mypassword";
Connection conn= DriverManager.getConnection(url,user,password);
8、access數(shù)據(jù)庫直連用ODBC的
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;
String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");
Connection conn = DriverManager.getConnection(url,"","");
Statement stmtNew=conn.createStatement() ;
二、JDBC連接MySql方式
下面是使用JDBC連接MySql的一個小的教程
1、查找驅(qū)動程序
MySQL目前提供的java驅(qū)動程序為Connection/J,可以從MySQL官方網(wǎng)站下載,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驅(qū)動程序為純java驅(qū)動程序,不需做其他配置。
2、動態(tài)指定classpath
如果需要執(zhí)行時動態(tài)指定classpath,就在執(zhí)行時采用-cp方式。否則將上面的.jar文件加入到classpath環(huán)境變量中。
3、加載驅(qū)動程序
try{
Class.forName(com.mysql.jdbc.Driver);
System.out.println(Success loading Mysql Driver!);
}catch(Exception e)
{
System.out.println(Error loading Mysql Driver!);
e.printStackTrace();
}
4、設(shè)置連接的url
jdbc:mysql://localhost/databasename[?pa=va][&pa=va]
#?
談?wù)凧DBC接口技術(shù)
2005-11-20 19:52 JDBC是一種可用于執(zhí)行SQL語句的JavaAPI(ApplicationProgrammingInterface應(yīng)用程序設(shè)計接口)。它由一些Java語言編寫的類和界面組成。JDBC為數(shù)據(jù)庫應(yīng)用開發(fā)人員、數(shù)據(jù)庫前臺工具開發(fā)人員提供了一種標準的應(yīng)用程序設(shè)計接口,使開發(fā)人員可以用純Java語言編寫完整的數(shù)據(jù)庫應(yīng)用程序。
一、ODBC到JDBC的發(fā)展歷程
說到JDBC,很容易讓人聯(lián)想到另一個十分熟悉的字眼“ODBC”。它們之間有沒有聯(lián)系呢?如果有,那么它們之間又是怎樣的關(guān)系呢?
ODBC是OpenDatabaseConnectivity的英文簡寫。它是一種用來在相關(guān)或不相關(guān)的數(shù)據(jù)庫管理系統(tǒng)(DBMS)中存取數(shù)據(jù)的,用C語言實現(xiàn)的,標準應(yīng)用程序數(shù)據(jù)接口。通過ODBCAPI,應(yīng)用程序可以存取保存在多種不同數(shù)據(jù)庫管理系統(tǒng)(DBMS)中的數(shù)據(jù),而不論每個DBMS使用了何種數(shù)據(jù)存儲格式和編程接口。
1.ODBC的結(jié)構(gòu)模型
ODBC的結(jié)構(gòu)包括四個主要部分:應(yīng)用程序接口、驅(qū)動器管理器、數(shù)據(jù)庫驅(qū)動器和數(shù)據(jù)源。
應(yīng)用程序接口:屏蔽不同的ODBC數(shù)據(jù)庫驅(qū)動器之間函數(shù)調(diào)用的差別,為用戶提供統(tǒng)一的SQL編程接口。
驅(qū)動器管理器:為應(yīng)用程序裝載數(shù)據(jù)庫驅(qū)動器。
數(shù)據(jù)庫驅(qū)動器:實現(xiàn)ODBC的函數(shù)調(diào)用,提供對特定數(shù)據(jù)源的SQL請求。如果需要,數(shù)據(jù)庫驅(qū)動器將修改應(yīng)用程序的請求,使得請求符合相關(guān)的DBMS所支持的文法。
數(shù)據(jù)源:由用戶想要存取的數(shù)據(jù)以及與它相關(guān)的操作系統(tǒng)、DBMS和用于訪問DBMS的網(wǎng)絡(luò)平臺組成。
雖然ODBC驅(qū)動器管理器的主要目的是加載數(shù)據(jù)庫驅(qū)動器,以便ODBC函數(shù)調(diào)用,但是數(shù)據(jù)庫驅(qū)動器本身也執(zhí)行ODBC函數(shù)調(diào)用,并與數(shù)據(jù)庫相互配合。因此當(dāng)應(yīng)用系統(tǒng)發(fā)出調(diào)用與數(shù)據(jù)源進行連接時,數(shù)據(jù)庫驅(qū)動器能管理通信協(xié)議。當(dāng)建立起與數(shù)據(jù)源的連接時,數(shù)據(jù)庫驅(qū)動器便能處理應(yīng)用系統(tǒng)向DBMS發(fā)出的請求,對分析或發(fā)自數(shù)據(jù)源的設(shè)計進行必要的翻譯,并將結(jié)果返回給應(yīng)用系統(tǒng)。
2.JDBC的誕生
自從Java語言于1995年5月正式公布以來,Java風(fēng)靡全球。出現(xiàn)大量的用java語言編寫的程序,其中也包括數(shù)據(jù)庫應(yīng)用程序。由于沒有一個Java語言的API,編程人員不得不在Java程序中加入C語言的ODBC函數(shù)調(diào)用。這就使很多Java的優(yōu)秀特性無法充分發(fā)揮,比如平臺無關(guān)性、面向?qū)ο筇匦缘取kS著越來越多的編程人員對Java語言的日益喜愛,越來越多的公司在Java程序開發(fā)上投入的精力日益增加,對java語言接口的訪問數(shù)據(jù)庫的API的要求越來越強烈。也由于ODBC的有其不足之處,比如它并不容易使用,沒有面向?qū)ο蟮奶匦缘鹊龋琒UN公司決定開發(fā)一Java語言為接口的數(shù)據(jù)庫應(yīng)用程序開發(fā)接口。在JDK1.x版本中,JDBC只是一個可選部件,到了JDK1.1公布時,SQL類包(也就是JDBCAPI)就成為Java語言的標準部件。
二、JDBC技術(shù)概述
JDBC是一種可用于執(zhí)行SQL語句的JavaAPI(ApplicationProgrammingInterface,應(yīng)用程序設(shè)計接口)。它由一些Java語言寫的類、界面組成。JDBC給數(shù)據(jù)庫應(yīng)用開發(fā)人員、數(shù)據(jù)庫前臺工具開發(fā)人員提供了一種標準的應(yīng)用程序設(shè)計接口,使開發(fā)人員可以用純Java語言編寫完整的數(shù)據(jù)庫應(yīng)用程序。
通過使用JDBC,開發(fā)人員可以很方便地將SQL語句傳送給幾乎任何一種數(shù)據(jù)庫。也就是說,開發(fā)人員可以不必寫一個程序訪問Sybase,寫另一個程序訪問Oracle,再寫一個程序訪問Microsoft的SQLServer。用JDBC寫的程序能夠自動地將SQL語句傳送給相應(yīng)的數(shù)據(jù)庫管理系統(tǒng)(DBMS)。不但如此,使用Java編寫的應(yīng)用程序可以在任何支持Java的平臺上運行,不必在不同的平臺上編寫不同的應(yīng)用。Java和JDBC的結(jié)合可以讓開發(fā)人員在開發(fā)數(shù)據(jù)庫應(yīng)用時真正實現(xiàn)“WriteOnce,RunEverywhere!”
Java具有健壯、安全、易用等特性,而且支持自動網(wǎng)上下載,本質(zhì)上是一種很好的數(shù)據(jù)庫應(yīng)用的編程語言。它所需要的是Java應(yīng)用如何同各種各樣的數(shù)據(jù)庫連接,JDBC正是實現(xiàn)這種連接的關(guān)鍵。
JDBC擴展了Java的能力,如使用Java和JDBCAPI就可以公布一個Web頁,頁中帶有能訪問遠端數(shù)據(jù)庫的Ap?plet。或者企業(yè)可以通過JDBC讓全部的職工(他們可以使用不同的操作系統(tǒng),如Windwos,Machintosh和UNIX)在In?tranet上連接到幾個全球數(shù)據(jù)庫上,而這幾個全球數(shù)據(jù)庫可以是不相同的。隨著越來越多的程序開發(fā)人員使用Java語言,對Java訪問數(shù)據(jù)庫易操作性的需求越來越強烈。
MIS管理人員喜歡Java和JDBC,因為這樣可以更容易經(jīng)濟地公布信息。各種已經(jīng)安裝在數(shù)據(jù)庫中的事務(wù)處理都將繼續(xù)正常運行,甚至這些事務(wù)處理是存儲在不同的數(shù)據(jù)庫管理系統(tǒng)中;而對新的數(shù)據(jù)庫應(yīng)用來說,開發(fā)時間將縮短,安裝和版本升級將大大簡化。程序員可以編寫或改寫一個程序,然后將它放在服務(wù)器上,而每個用戶都可以訪問服務(wù)器得到最新的版本。對于信息服務(wù)行業(yè),Java和JDBC提供了一種很好的向外界用戶更新信息的方法。
1.JDBC的任務(wù)
簡單地說,JDBC能完成下列三件事:
1)同一個數(shù)據(jù)庫建立連接;
2)向數(shù)據(jù)庫發(fā)送SQL語句;
3)處理數(shù)據(jù)庫返回的結(jié)果。
2.JDBC一種底層的API
JDBC是一種底層API,這意味著它將直接調(diào)用SQL命令。JDBC完全勝任這個任務(wù),而且比其他數(shù)據(jù)庫互聯(lián)更加容易實現(xiàn)。同時它也是構(gòu)造高層API和數(shù)據(jù)庫開發(fā)工具的基礎(chǔ)。高層API和數(shù)據(jù)庫開發(fā)工具應(yīng)該是用戶界面更加友好,使用更加方便,更易于理解的。但所有這樣的API將最終被翻譯為象JDBC這樣的底層API。目前兩種基于JDBC的高層API正處在開發(fā)階段。
1)SQL語言嵌入Java的預(yù)處理器。雖然DBMS已經(jīng)實現(xiàn)了SQL查詢,但JDBC要求SQL語句被當(dāng)作字符串參數(shù)傳送給Java程序。而嵌入式SQL預(yù)處理器允許程序員將SQL語句混用:Java變量可以在SQL語句中使用,來接收或提供數(shù)值。然后SQL的預(yù)處理器將把這種Java/SQL混用的程序翻譯成帶有JDBCAPI的Java程序。
2)實現(xiàn)從關(guān)系數(shù)據(jù)庫到Java類的直接映射。Javasoft和其他公司已經(jīng)宣布要實現(xiàn)這一技術(shù)。在這種“對象/關(guān)系”映射中,表的每一行都將變成這類的一個實例,每一列的值對應(yīng)實例的一個屬性。程序員可以直接操作Java的對象;而存取所需要的SQL調(diào)用將在內(nèi)部直接產(chǎn)生。還可以實現(xiàn)更加復(fù)雜的映射,比如多張表的行在一個Java的類中實現(xiàn)。
隨著大家對JDBC興趣的不斷濃厚,越來越多的開發(fā)人員已經(jīng)開始利用JDBC為基礎(chǔ)的工具進行開發(fā)。這使開發(fā)工作變得容易。同時,程序員也正在開發(fā)對最終用戶來說訪問數(shù)據(jù)庫更加容易的應(yīng)用程序。
3.JDBC和ODBC及其他API的比較
到目前為止,微軟的ODBC可能是用得最廣泛的訪問關(guān)系數(shù)據(jù)庫的API。它提供了連接幾乎任何一種平臺、任何一種數(shù)據(jù)庫的能力。那么,為什么不直接從Java中直接使用ODBC呢?
回答是可以從Java中使用ODBC,但最好在JDBC的協(xié)助下,用JDBC-ODBC橋接器實現(xiàn)。那么,為什么需要JDBC呢?要回答這個問題,有這么幾個方面:
1)ODBC并不適合在Java中直接使用。ODBC是一個C語言實現(xiàn)的API,從Java程序調(diào)用本地的C程序會帶來一系列類似安全性、完整性、健壯性的缺點。
2)其次,完全精確地實現(xiàn)從C代碼ODBC到JavaAPI寫的ODBC的翻譯也并不令人滿意。比如,Java沒有指針,而ODBC中大量地使用了指針,包括極易出錯的空指針“void*”。因此,對Java程序員來說,把JDBC設(shè)想成將ODBC轉(zhuǎn)換成面向?qū)ο蟮腁PI是很自然的。
3)ODBC并不容易學(xué)習(xí),它將簡單特性和復(fù)雜特性混雜在一起,甚至對非常簡單的查詢都有復(fù)雜的選項。而JDBC剛好相反,它保持了簡單事物的簡單性,但又允許復(fù)雜的特性。
4)JDBC這樣的JavaAPI對于純Java方案來說是必須的。當(dāng)使用ODBC時,人們必須在每一臺客戶機上安裝ODBC驅(qū)動器和驅(qū)動管理器。如果JDBC驅(qū)動器是完全用Java語言實現(xiàn)的話,那么JDBC的代碼就可以自動的下載和安裝,并保證其安全性,而且,這將適應(yīng)任何Java平臺,從網(wǎng)絡(luò)計算機NC到大型主機Mainframe。
總而言之,JDBCAPI是能體現(xiàn)SQL最基本抽象概念的、最直接的Java接口。它建構(gòu)在ODBC的基礎(chǔ)上,因此,熟悉ODBC的程序員將發(fā)現(xiàn)學(xué)習(xí)JDBC非常容易。JDBC保持了ODBC的基本設(shè)計特征。實際上,這兩種接口都是基于X/OPENSQL的調(diào)用級接口(CLI)。它們的最大的不同是JDBC是基于Java的風(fēng)格和優(yōu)點,并強化了Java的風(fēng)格和優(yōu)點。
最近,微軟又推出了除了ODBC以外的新的API,如RDO,ADO和OLEDB。這些API事實上在很多方面上同JDBC一樣朝著相同的方向努力,也就是努力成為一個面向?qū)ο蟮模贠DBC的類接口。然而,這些接口目前并不能代替ODBC,尤其在ODBC驅(qū)動器已經(jīng)在市場完全形成的時候,更重要的是它們只是ODBC的“漂亮的包裝”。
4.JDBC兩層模型和三層模型
JDBC支持兩層模型,也支持三層模型訪問數(shù)據(jù)庫。 兩層模型中,一個java Appple或者一個JA-va應(yīng)用直接同數(shù)據(jù)庫連接。這就需要能直接被訪問的數(shù)據(jù)庫進行連接的JDBC驅(qū)動器。用戶的SQL語句被傳送給數(shù)據(jù)庫,而這些語句執(zhí)行的結(jié)果將被傳回給用戶。數(shù)據(jù)庫可以在同一機器上,也可以另一機器上通過網(wǎng)絡(luò)進行連接。這被稱為“Client/Server”結(jié)構(gòu),用戶的計算機作為Client,運行數(shù)據(jù)庫的計算機作為Server。這個網(wǎng)絡(luò)可是intranet,比如連接全體雇員的企業(yè)內(nèi)部網(wǎng),當(dāng)然也可以是internet。
在三層模型中,命令將被發(fā)送到服務(wù)的“中間層”,而“中間層”將SQL語句發(fā)送到數(shù)據(jù)庫。數(shù)據(jù)庫處理SQL語句并將結(jié)果返回“中間層”,然后“中間層”將它們 返回用戶。MIS管理員將發(fā)現(xiàn)三層模型很有吸引力,因為“中間層”可以進行對訪問的控制并協(xié)同數(shù)據(jù)庫的更新,另一個優(yōu)勢就是如果有一個“中間層”用戶就可以使用一個易用的高層的API,這個API可以由“中間層”進行轉(zhuǎn)換,轉(zhuǎn)換成底層的調(diào)用。而且,在許多情況下,三層模型可以提供更好的性能。
到目前為止,“中間層”通常還是用C或C++實現(xiàn),以保證其高性能。但隨著優(yōu)化編譯器的引入,將java的字節(jié)碼轉(zhuǎn)換成高效的機器碼,用java來實現(xiàn)“中間層”將越來越實際。而JDBC是允許從一個java“中間層”訪問數(shù)據(jù)庫的關(guān)鍵。 (T111)
posted on 2006-11-17 17:44
PrettyBoy 閱讀(556)
評論(0) 編輯 收藏