JDBC簡介
JDBC(Java Data Base Connectivity,java數據庫連接)是一種用於執行SQL語句的Java API,它是Java十三個規范之一。可以為多種關系數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基准,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序,同時,JDBC也是個商標名。
ODBC簡介
開放數據庫互連(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)》等相關的標准文件。
兩者之間的聯系
JDBC和ODBC都是用來連接數據庫的啟動程序,JDBC和ODBC由於具有數據庫獨立性甚至平台無關性,因而對Internet上異構數據庫的訪問提供了很好的支持。
1.JDBC比ODBC更容易理解
從事編程工作的朋友都知道Java比C語言更好學,主要是因為Java語言是面向對象的更接近人的思維認識,更容易被人接受。而C語言就較為抽象,跟人的認識思維相差較大,其開發出來的產品也具有類似特點。在ODBC中一個的簡單的查詢,也需求分為好幾塊內容;而在ODBC驅動程序內部再去整合,做一些復雜的操作。這不僅降低了數據庫啟動程序的性能,而且也給程序開發者開發實際運用程序帶來了確定的負面效果。而JDBC數據庫啟動程序在設計的時間就包含了大部份基本數據操作功能,為此在編寫一些常規的數據庫操作語句時,如查詢、更新等等,其所需求的源代碼比 ODBC要少的多。故從這方面來說,JDBC數據庫啟動程序要比ODBC簡易理解。
2.JDBC數據庫驅動程序是面向對象的
JDBC完全遵循Java語言的優良特性。通常情況下,只要有Java功能需設計基礎的用戶都能在最短時間內了解JDBC驅動程序的架構,較量簡易上手,能輕而易舉的開發出強悍的數據庫實際運用程序。而ODBC的話,由於其內部功能復雜,源代碼編寫要求高。為此即使是一個的C語言的高手,仍然需求花費不少的時間去了解那個數據庫啟動程序;在編寫源代碼的時間,還離不開有關的參考書本。
3.JDBC的移植性要比ODBC要好。
通常情況下,安裝完ODBC驅動程序之后,還需求經過確定的配置才能夠應用。而不相同的配置在不相同數據庫服務器之間不能夠通用。也那是說,裝一次需求配置一次。但是JDBC數據庫驅動程序則不相同。假如采用JDBC數據庫驅動程序的話,則只需要選取適當的 JDBC數據庫驅動程序,就不需要額外的配置。在安裝過程中,JDBC數據庫驅動程序會自己完成有關的配置。為此JDBC的移植性要比ODBC要好。
從ODBC向JDBC過度
也許數據庫編程以前采用的是ODBC驅動程序,而假如數據庫編程目前需要采用JDBC驅動程序,那么能否出現順利過渡呢?答案是肯定的。在JDBC驅動程序中有一類叫作JDBC-ODBC橋接啟動程序。這種類別的JDBC數據庫驅動程序其底層是經過ODBC驅動程序來連接數據庫的。假如原先的實際運用程序是基於ODBC數據庫驅動程序的,或者數據庫沒有幫助對應的JDBC驅動程序,則數據庫編程能利用JDBC-ODBC橋接驅動程序來實現。也那是說,橋接驅動程序能利用現有的ODBC驅動程序來存取聯系型數據庫。為此者不僅能保留先前的開發架構(經過ODBC來存取數據),還能立即應用Java作為新的開發環境,從而出現ODBC數據庫驅動程序到JDBC的順利轉型。
不過在采用這種橋接驅動程序的時間,需求留意幾個難點。一是那個橋接驅動程序仍然需要用到ODBC數據庫驅動程序。由於橋接驅動程序直接聯系的對象是ODBC驅動程序,然后再經過ODBC驅動程序去訪問數據庫。為此在客戶端必需先安裝並配置好ODBC驅動程序。假如采用的是三層式的開發框架,也需求安裝ODBC驅動程序。其次,在這種模式下,實際運用程序先調用JDBC,然后再經過JDBC調用ODBC,最后再跟數據庫通信。顯然其中間多了幾個環節。由於其中間環節較量多,但數據訪問出現難點的時候,就不太好查難點。這就好像一道水管,假如中間的接口多了的話,則除了漏水的幾率就較量高。假如真的除了漏水的話,則查詢漏水點的時間也會較量困難。為此筆者以為,采用橋接類別的JDBC驅動程序只是權宜之計。在適當的時間,數據庫開發還是需要調整原先的開發架構,全部都轉到JDBC驅動程序上來。橋接程序只是為數據庫開發爭取確定的時間。雖然那個轉型過程中的陣痛是較痛的,但確是不可避免的。長痛不如短痛,筆者意見數據庫開發還是及早停止過渡為好。並在估計的情況下,把以前的開發架構也停止調整,以采用真正意義上的JDBC驅動程序。
JDBC雖然在一定程度上比ODBC操作簡單,容易理解。但是世間萬物存在即有道理,並不是說JDBC好就所有的情況下都能使用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數據庫進行,其他數據庫類似。