1、定義:
JDBC(jdbc的本質是接口,由sun公司定義)
JDBC(Java Data Base Connectivity,java資料庫連接配接)是一種用于執行SQL語句的Java API,可以為多種關系資料庫提供統一通路,它由一組用Java語言編寫的類和接口組成。JDBC為工具/資料庫開發人員提供了一個标準的API,據此可以建構更進階的工具和接口,使資料庫開發人員能夠用純 Java API 編寫資料庫應用程式。
有了JDBC,向各種關系資料發送SQL語句就是一件很容易的事。換言之,有了JDBC API,就不必為通路Sybase資料庫專門寫一個程式,為通路Oracle資料庫又專門寫一個程式,或為通路Informix資料庫又編寫另一個程式等等,程式員隻需用JDBC API寫一個程式就夠了,它可向相應資料庫發送SQL調用,而具體的執行,由個各個資料庫廠商提供的jdbc驅動來完成,jdbc的驅動是一個jar包,比如oracle的jdbc驅動在$ORACLE_HOME/jdbc/ojdbc6.jar。同時,将Java語言和JDBC結合起來使程式員不必為不同的平台編寫不同的應用程式,隻須寫一遍程式就可以讓它在任何平台上運作,這也是Java語言“編寫一次,處處運作”的優勢。
Java資料庫連接配接體系結構是用于Java應用程式連接配接資料庫的标準方法。JDBC對Java程式員而言是API,對實作與資料庫連接配接的服務提供商而言是接口模型。作為API,JDBC為程式開發提供标準的接口,并為資料庫廠商及第三方中間件廠商實作與資料庫的連接配接提供了标準方法。JDBC使用已有的SQL标準并支援與其它資料庫連接配接标準,如ODBC之間的橋接。JDBC實作了所有這些面向标準的目标并且具有簡單、嚴格類型定義且高性能實作的接口。
Java 具有堅固、安全、易于使用、易于了解和可從網絡上自動下載下傳等特性,是編寫資料庫應用程式的傑出語言。所需要的隻是 Java應用程式與各種不同資料庫之間進行對話的方法。而 JDBC 正是作為此種用途的機制。
JDBC 擴充了 Java 的功能。例如,用 Java 和 JDBC API 可以釋出含有 applet 的網頁,而該 applet 使用的資訊可能來自遠端資料庫。企業也可以用 JDBC 通過 Intranet 将所有職員連到一個或多個内部資料庫中(即使這些職員所用的計算機有 Windows、 Macintosh 和UNIX 等各種不同的作業系統)。随着越來越多的程式員開始使用Java 程式設計語言,對從 Java 中便捷地通路資料庫的要求也在日益增加。
MIS管理者們都喜歡 Java 和 JDBC 的結合,因為它使資訊傳播變得容易和經濟。企業可繼續使用它們安裝好的資料庫,并能便捷地存取資訊,即使這些資訊是儲存在不同資料庫管理系統上。新程式的開發期很短。安裝和版本控制将大為簡化。程式員可隻編寫一遍應用程式或隻更新一次,然後将它放到伺服器上,随後任何人就都可得到最新版本的應用程式。對于商務上的銷售資訊服務, Java 和JDBC 可為外部客戶提供擷取資訊更新的更好方法。
2、支援:
JDBC API 既支援資料庫通路的兩層模型(C/S),同時也支援三層模型(B/S)。在兩層模型中,Java applet或應用程式将直接與資料庫進行對話。這将需要一個JDBC驅動程式來與所通路的特定資料庫管理系統進行 通訊。使用者的SQL語句被送往資料庫中,而其結果将被送回給使用者。資料庫可以位于另一台計算機上,使用者通過網絡連接配接到上面。這就叫做客戶機/伺服器配置,其中使用者的計算機為客戶機,提供資料庫的計算機為伺服器。網絡可以是 Intranet(它可将公司職員連接配接起來),也可以是 Internet。
在三層模型中,指令先是被發送到服務的"中間層",然後由它将SQL 語句發送給資料庫。資料庫對 SQL 語句進行處理并将結果送回到中間層,中間層再将結果送回給使用者。MIS 主管們都發現三層模型很吸引人,因為可用中間層來控制對公司資料的通路和可作的的更新的種類。中間層的另一個好處是,使用者可以利用易于使用的進階API,而中間層将把它轉換為相應的低級調用。最後,許多情況下三層結構可提供一些性能上的好處。
到目前為止,中間層通常都用 C 或 C++ 這類語言來編寫,這些語言執行速度較快。然而,随着最優化編譯器(它把 Java位元組代碼轉換為高效的特定于機器的代碼)的引入,用 Java 來實作中間層将變得越來越實際。這将是一個很大的進步,它使人們可以充分利用 Java 的諸多優點(如堅固、多線程和安全等特征)。JDBC 對于從Java的中間層來通路資料庫非常重要。
3、JDBC的工作步驟:

3.1、裝載(或者叫注冊)驅動程式并建立連接配接
你需要做的第一事情是你與想要使用的 DBMS 建立一個連接配接。這包含 2 個步驟:裝載(或者叫注冊)驅動程式并建立連接配接。
第一步是:裝載驅動程式
隻需要非常簡單的一行代碼。例如,你想要使用 JDBC-ODBC 橋驅動程式, 可以用下列代碼裝載它:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
你的驅動程式文檔将告訴你應該使用的類名。例如, 如果類名是 jdbc.DriverXYZ ,你将用代碼以下的代碼裝載驅動程式:
Class.forName("jdbc.DriverXYZ");
你不需要建立一個驅動程式類的執行個體并且用 DriverManager 登記它,因為調用 Class.forName 将自動加載驅動程式類。如果你曾自己建立執行個體,你将建立一個不必要的副本,但它不會帶來什麼壞處。
DriverManager 類是 JDBC 的管理層,作用于使用者和驅動程式之間。它跟蹤可用的驅動程式,并在資料庫和相應驅動程式之間建立連接配接。另外,DriverManager類也處理諸如驅動程式登入時間限制及登入和跟蹤消息的顯示等事務。 對于簡單的應用程式,一般程式員需要在此類中直接使用的唯一方法是DriverManager.getConnection。正如名稱所示,該方法将建立與資料庫的連接配接。JDBC允許使用者調用DriverManager的方法getDriver、getDrivers和registerDriver及Driver的方法connect。但多數情況下,讓DriverManager類管理建立連接配接的細節為上策。
加載 Driver 類後,它們即可用來與資料庫建立連接配接。
第二步就是用适當的驅動程式類與 DBMS 建立一個連接配接。下列代碼是一般的做法:
Connection con = DriverManager.getConnection(url, "myLogin", "myPassword");
當執行這個語句的時候,DriverManager類(jdbc管理層)會找到合适的驅動程式,因為這個類裡有針對不同資料庫的所有驅動的一個清單。當調用getConnection()方法的時候,會檢查驅動清單中所有的驅動程式, 找到那個與目前資料庫比對的那個,然後那個驅動程式的方法:connect會使用這個url去連接配接資料庫。
這個步驟也非常簡單,需要注意如何提供 url(各個資料庫不同)。如果你正在使用 JDBC-ODBC 橋, JDBC URL 将以 jdbc:odbc 開始:餘下 URL 通常是你的資料源名字或資料庫系統。是以,假設你正在使用 ODBC 存取一個叫 "Fred" 的 ODBC資料源(注意,這裡就是說,url裡寫明資料源,直接與資料源進行互動。後面我們再讨論什麼是資料源),你的 JDBC URL 是 jdbc:odbc:Fred 。把 "myLogin" 及 "myPassword" 替換為你登陸 DBMS 的使用者名及密碼。如果你登陸資料庫系統的使用者名為 "Fernanda" 密碼為 "J8",隻需下面的 2 行代碼就可以建立一個連接配接:
String url = "jdbc:odbc:Fred";
Connection con = DriverManager.getConnection(url,"Fernanda", "J8");
如果你使用的是第三方開發了的 JDBC驅動程式,文檔将告訴你該使用什麼 subprotocol, 就是在 JDBC URL 中放在 jdbc 後面的部分。例如, 如果驅動程式開發者注冊了 acme 作為 subprotocol, JDBC URL 的第一和第二部分将是 jdbc:acme。驅動程式文檔也會告訴你餘下 JDBC URL 的格式。JDBC URL 最後一部分提供了定位資料庫的資訊。
如果你裝載的驅動程式識别了提供給 DriverManager.getConnection 的 JDBC URL ,那個驅動程式将根據 JDBC URL 建立一個到指定 DBMS 的連接配接。正如名稱所示,DriverManager 類在幕後為你管理建立連接配接的所有細節。除非你是正在寫驅動程式,你可能無需使用此類的其它任何方法,一般程式員需要在此類中直接使用的唯一方法是 DriverManager.getConnection。
DriverManager.getConnection 方法傳回一個打開的連接配接,你可以使用此連接配接建立 JDBC statements 并發送 SQL 語句到資料庫。在前面的例子裡,con 對象是一個打開的連接配接,并且我們要在以後的例子裡使用它。
我總結下,大概是這樣:首先是應用程式加載驅動程式類;DriverManager 類的getConnection 方法,找到對應的驅動程式,獲得連接配接url,登入名,密碼,然後建立好的的連接配接也是由DriverManager 類來管理的。
Connection 對象代表與資料庫的連接配接。連接配接過程包括所執行的 SQL 語句和在該連接配接上所傳回的結果。一個應用程式可與單個資料庫有一個或多個連接配接,或者可與許多資料庫有連接配接。
與資料庫建立連接配接的标準方法是調用DriverManager.getConnection方法。該方法接受含有某個URL的字元串。DriverManager類(即所謂的JDBC管理層)将嘗試找到可與那個URL所代表的資料庫進行連接配接的驅動程式。DriverManager類存有已注冊的Driver類的清單。當調用方法getConnection時,它将檢查清單中的每個驅動程式,直到找到可與URL中指定的資料庫進行連接配接的驅動程式為止。Driver的方法connect使用這個URL來建立實際的連接配接。
使用者可繞過JDBC管理層直接調用Driver方法。這在以下特殊情況下将很有用:當兩個驅動器可同時連接配接到資料庫中,而使用者需要明确地選用其中特定的驅動器。但一般情況下,讓DriverManager類處理打開連接配接這種事将更為簡單。
下述代碼顯示如何打開一個與位于URL"jdbc:odbc:wombat"的資料庫的連接配接。所用的使用者辨別符為"freely",密碼為"ec":
String url = "jdbc:odbc:wombat"; Connection con = DriverManager.getConnection(url, "freely", "ec");
連接配接一旦建立,就可用來向它所涉及的資料庫傳送SQL語句。JDBC對可被發送的SQL語句類型不加任何限制。這就提供了很大的靈活性,即允許使用特定的資料庫語句或甚至于非SQL語句。然而,它要求使用者自己負責確定所涉及的資料庫可以處理所發送的SQL語句,否則将自食其果。例如,如果某個應用程式試圖向不支援儲存程式的DBMS發送儲存程式調用,就會失敗并将抛出異常。JDBC要求驅動程式應至少能提供ANSI SQL-2 Entry Level功能才可算是符合JDBC标準TM的。這意味着使用者至少可信賴這一标準級别的功能。
JDBC提供了三個類,用于向資料庫發送SQL語句。Connection接口中的三個方法可用于建立這些類的執行個體。下面列出這些類及其建立方法:
(1)Statement:由方法createStatement所建立。Statement對象用于發送簡單的SQL語句。
(2)PreparedStatement:由方法prepareStatement所建立。PreparedStatement對象用于發送帶有一個或多個輸入參數(IN參數)的SQL語句。PreparedStatement擁有一組方法,用于設定IN參數的值。執行語句時,這些IN參數将被送到資料庫中。PreparedStatement的執行個體擴充了Statement,是以它們都包括了Statement的方法。PreparedStatement對象有可能比Statement對象的效率更高,因為它已被預編譯過并存放在那以供将來使用。
(3)CallableStatement:由方法prepareCall所建立。CallableStatement對象用于執行SQL儲存程式─一組可通過名稱來調用(就象函數的調用那樣)的SQL語句。CallableStatement對象從PreparedStatement中繼承了用于處理IN參數的方法,而且還增加了用于處理OUT參數和INOUT參數的方法。
不過通常來說createStatement方法用于簡單的SQL語句(不帶參數)、prepareStatement方法用于帶一個或多個IN參數的SQL語句或經常被執行的簡單SQL語句,而prepareCall方法用于調用已儲存過程。
3.3、處理結果并關閉連接配接
這個沒得說,處理結果是通過應用程式寫的方法來處理;最後要關閉connection
事務由一個或多個這樣的語句組成:這些語句已被執行、完成并被送出或還原。當調用方法commit或rollback時,目前事務即告就結束,另一個事務随即開始。預設情況下,新連接配接将處于自動送出模式。也就是說,當執行完語句後,将自動對那個語句調用commit方法。這種情況下,由于每個語句都是被單獨送出的,是以一個事務隻由一個語句組成。如果禁用自動送出模式,事務将要等到commit或rollback方法被顯式調用時才結束,是以它将包括上一次調用commit或rollback方法以來所有執行過的語句。對于第二種情況,事務中的所有語句将作為組來送出或還原。
方法commit使SQL語句對資料庫所做的任何更改成為永久性的,它還将釋放事務持有的全部鎖。而方法rollback将棄去那些更改。有時使用者在另一個更改生效前不想讓此更改生效。這可通過禁用自動送出并将兩個更新組合在一個事務中來達到。如果兩個更新都是成功,則調用commit方法,進而使兩個更新結果成為永久性的;如果其中之一或兩個更新都失敗了,則調用rollback方法,以将值恢複為進行更新之前的值。
大多數JDBC驅動程式都支援事務。事實上,符合JDBC的驅動程式必須支援事務。DatabaseMetaData給出的資訊描述DBMS所提供的事務支援水準。
JavaSoft架構:
JavaSoft提供三種JDBC産品元件,它們是Java開發工具包(JDK)的組成部份:JDBC驅動程式管理器、JDBC驅動程式測試工具包和JDBC-ODBC橋。
JDBC驅動程式管理器是JDBC體系結構的支柱。它實際上很小,也很簡單;其主要作用是把Java應用程式連接配接到正确的JDBC驅動程式上,然後即退出。
JDBC驅動程式測試工具包為使JDBC驅動程式運作您的程式提供一定的可信度。隻有通過JDBC驅動程式測試的驅動程式才被認為是符合JDBC标準TM的。
JDBC-ODBC橋使ODBC驅動程式可被用作JDBC驅動程式。它的實作為JDBC的快速發展提供了一條途徑,其長遠目标提供一種通路某些不常見的DBMS(如果對這些不常見的DBMS未實作JDBC)的方法。
不足:
盡管JDBC在JAVA語言層面實作了統一,但不同資料庫仍舊有許多差異。為了更好地實作跨資料庫操作,于是誕生了Hibernate項目,Hibernate是對JDBC的再封裝,實作了對資料庫操作更寬泛的統一和更好的可移植性。