JDBC(Java Data Base Connectivity,java數據庫鏈接)是一種用於執行SQL語句的Java API,它是Java十三個規範之一。能夠爲多種關係數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此能夠構建更高級的工具和接口,使數據庫開發人員可以編寫數據庫應用程序,同時,JDBC也是個商標名。java
開放數據庫互連(Open Database Connectivity,ODBC)是微軟公司開放服務結構(WOSA,Windows Open Services Architecture)中有關數據庫的一個組成部分,它創建了一組規範,並提供了一組對數據庫訪問的標準API(應用程序編程接口)。這些API利用SQL來完成其大部分任務。ODBC自己也提供了對SQL語言的支持,用戶能夠直接將SQL語句送給ODBC。開放數據庫互連(ODBC)是Microsoft提出的數據庫訪問接口標準。開放數據庫互連定義了訪問數據庫API的一個規範,這些API獨立於不一樣廠商的DBMS,也獨立於具體的編程語言(可是Microsoft的ODBC文檔是用C語言描述的,許多實際的ODBC驅動程序也是用C語言寫的。)ODBC規範後來被X/OPEN和ISO/IEC採納,做爲SQL標準的一部分,具體內容能夠參看《ISO/IEC 9075-3:1995 (E) Call-Level Interface (SQL/CLI)》等相關的標準文件。mysql
JDBC和ODBC都是用來鏈接數據庫的啓動程序,JDBC和ODBC因爲具備數據庫獨立性甚至平臺無關性,於是對Internet上異構數據庫的訪問提供了很好的支持。sql
從事編程工做的朋友都知道Java比C語言更好學,主要是由於Java語言是面向對象的更接近人的思惟認識,更容易被人接受。而C語言就較爲抽象,跟人的認識思惟相差較大,其開發出來的產品也具備相似特色。在ODBC中一個的簡單的查詢,也需求分爲好幾塊內容;而在ODBC驅動程序內部再去整合,作一些複雜的操做。這不只下降了數據庫啓動程序的性能,並且也給程序開發者開發實際運用程序帶來了肯定的負面效果。而JDBC數據庫啓動程序在設計的時間就包含了大部份基本數據操做功能,爲此在編寫一些常規的數據庫操做語句時,如查詢、更新等等,其所需求的源代碼比 ODBC要少的多。故從這方面來講,JDBC數據庫啓動程序要比ODBC簡易理解。編程
JDBC徹底遵循Java語言的優良特性。一般狀況下,只要有Java功能需設計基礎的用戶都能在最短期內瞭解JDBC驅動程序的架構,較量簡易上手,能垂手可得的開發出強悍的數據庫實際運用程序。而ODBC的話,因爲其內部功能複雜,源代碼編寫要求高。爲此即便是一個的C語言的高手,仍然需求花費很多的時間去了解那個數據庫啓動程序;在編寫源代碼的時間,還離不開有關的參考書本。服務器
一般狀況下,安裝完ODBC驅動程序以後,還需求通過肯定的配置纔可以應用。而不相同的配置在不相同數據庫服務器之間不可以通用。也那是說,裝一次需求配置一次。可是JDBC數據庫驅動程序則不相同。假如採用JDBC數據庫驅動程序的話,則只須要選取適當的 JDBC數據庫驅動程序,就不須要額外的配置。在安裝過程當中,JDBC數據庫驅動程序會本身完成有關的配置。爲此JDBC的移植性要比ODBC要好。架構
也許數據庫編程之前採用的是ODBC驅動程序,而假如數據庫編程目前須要採用JDBC驅動程序,那麼可否出現順利過渡呢?答案是確定的。在JDBC驅動程序中有一類叫做JDBC-ODBC橋接啓動程序。這種類別的JDBC數據庫驅動程序其底層是通過ODBC驅動程序來鏈接數據庫的。假如原先的實際運用程序是基於ODBC數據庫驅動程序的,或者數據庫沒有幫助對應的JDBC驅動程序,則數據庫編程能利用JDBC-ODBC橋接驅動程序來實現。也那是說,橋接驅動程序能利用現有的ODBC驅動程序來存取聯繫型數據庫。爲此者不只能保留先前的開發架構(通過ODBC來存取數據),還能當即應用Java做爲新的開發環境,從而出現ODBC數據庫驅動程序到JDBC的順利轉型。oracle
不過在採用這種橋接驅動程序的時間,需求留意幾個難點。一是那個橋接驅動程序仍然須要用到ODBC數據庫驅動程序。因爲橋接驅動程序直接聯繫的對象是ODBC驅動程序,而後再通過ODBC驅動程序去訪問數據庫。爲此在客戶端必需先安裝並配置好ODBC驅動程序。假如採用的是三層式的開發框架,也需求安裝ODBC驅動程序。其次,在這種模式下,實際運用程序先調用JDBC,而後再通過JDBC調用ODBC,最後再跟數據庫通訊。顯然其中間多了幾個環節。因爲其中間環節較量多,但數據訪問出現難點的時候,就不太好查難點。這就好像一道水管,假如中間的接口多了的話,則除了漏水的概率就較量高。假如真的除了漏水的話,則查詢漏水點的時間也會較量困難。爲此筆者覺得,採用橋接類別的JDBC驅動程序只是權宜之計。在適當的時間,數據庫開發仍是須要調整原先的開發架構,所有都轉到JDBC驅動程序上來。橋接程序只是爲數據庫開發爭取肯定的時間。雖然那個轉型過程當中的陣痛是較痛的,但確是不可避免的。長痛不如短痛,筆者意見數據庫開發仍是及早中止過渡爲好。並在估計的狀況下,把之前的開發架構也中止調整,以採用真正意義上的JDBC驅動程序。app
JDBC雖然在必定程度上比ODBC操做簡單,容易理解。可是世間萬物存在即有道理,並非說JDBC好就全部的狀況下都能使用JDBC,二者之間沒有好壞之分,只是在特定的狀況下可以選取合適的實現方式便可。框架
jdbc:使用Java代碼發送sql語句的技術就是jdbc技術。即jdbc是一個接口,用於不一樣的數據庫(oracle、mysql、sqlserver。。)的操做。使用jdbc發送sql語句的前提:
登陸數據庫服務器(鏈接數據庫服務器)
(數據庫的)IP地址
端口
(數據庫)用戶名
密碼
JDBC的URL=協議名+子協議名+數據源名。
a 協議名老是「jdbc」。
b 子協議名由JDBC驅動程序的編寫者決定。
c 數據源名也可能包含用戶與口令等信息;這些信息也可單獨提供。
幾種常見的數據庫鏈接
——————————-oracle——————
驅動:oracle.jdbc.driver.OracleDriver
URL:jdbc:oracle:thin:@machine_name:port:dbname
注:machine_name:數據庫所在的機器的名稱;
port:端口號,默認是1521
——————————-mysql——————-
驅動:com.mysql.jdbc.Driver
URL:jdbc:mysql://machine_name:port/dbname
注:machine_name:數據庫所在的機器的名稱(本機通常默認爲localhost);
port:端口號,默認3306
—————————SQL Server——————
驅動:com.microsoft.jdbc.sqlserver.SQLServerDriver
URL:jdbc:microsoft:sqlserver://<:port>;DatabaseName=
注:machine_name:數據庫所在的機器的名稱;
port:端口號,默認是1433
————————–DB2————————–
驅動:com.ibm.db2.jdbc.app.DB2Driver
URL:jdbc:db2://<:port>/dbname
注:machine_name:數據庫所在的機器的名稱;(port默認5000)
這裏以Mysql爲例。
所需jar包:mysql-connector-java-5.1.7-bin.jar
代碼以下:
import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.util.Properties; import org.junit.Test; public class Demo1{ //首先鏈接到數據庫的URL private String url = "jbdc:mysql://localhost:3306/demo";/*jdbc協議:數據庫子協議:主機:端口/鏈接的數據庫*/ private String user = "root";//數據庫用戶名 private String password = "root";//數據庫密碼 /* 第一種方法 */ @Test public void test1() throws Exception{ //1.建立驅動程序類對象 Driver driver = new com.mysql.jdbc.Driver();//須要導入上面提到的jar包 //設置用戶名和密碼 Properties pro = new Properties(); pro.setProperty("user",user); pro.setProperty("password",password); //2.鏈接數據庫 Connection conn = driver.connect(url,pro); //測試是否鏈接成功 System.out.println(conn); } /* 第二種方法(使用驅動管理器類鏈接數據庫) */ @Test public void test2() throws Exception{ //建立驅動程序類對象 Dirver dirver = new com.mysql.jdbc.Dirver(); /*Mysql*/ //Driver driver2 = new com.oracle.jdbc.Driver();/*oracle*/ //1.註冊驅動程序(能夠註冊多個) DirverManager.registerDirver(dirver); //2.創建鏈接到數據庫 Connection conn = DriverManager.getConnection(url, user, password); //測試是否鏈接成功 System.out.println(conn); } }
運行後,成功結果應該會顯示相似信息:
分析:在test2方法中,建立驅動程序類對象new com.mysql.jdbc.Dirver(); 後在進行註冊驅動程序DirverManager.registerDirver(dirver); 實際上已經註冊了兩次。由於在Driver.class文件中有以下一段靜態代碼塊:
// --------------------------------------------- // // Register ourselves with the DriverManager // static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } }
即在進行建立驅動程序類對象Driver的時候就執行了registerDriver(new Driver());,因此第二種方法中省略DirverManager.registerDirver(dirver);語句也正確。
基於以上分析,能夠採用 經過獲得字節碼對象的方式加載靜態代碼塊,從而註冊驅動程序,即把建立驅動類對象語句換成Class.forName(「com.mysql.jdbc.Driver」);括號內雙引號語句爲Dirver.Class文件所在的包名(上面所提到的jar包裏面)便可。完整代碼以下:
@Test public void test3() throws Exception{ //經過獲得字節碼對象的方式加載靜態代碼塊,從而註冊驅動程序 Class.forName("com.mysql.jdbc.Driver"); //2.鏈接到具體的數據庫 Connection conn = DriverManager.getConnection(url, user, password); System.out.println(conn); }
據此,這部分的鏈接已經成功了。對代碼進行簡單的分析有助於理解記憶而不是死記硬背達到活學活用。本例以Mysql數據庫進行,其餘數據庫相似。