注意:本編文章以下代碼均爲簡寫方式,無法執行,僅供參考
1. JDBC的由來
直接使用socket協議訪問數據庫
應用程序可以直接通過多種方式訪問數據庫,最普通的是通過socket訪問數據庫。以Mysql 爲例:首先通過程序通過socket和數據庫建立了TCP連接,把準備執行的SQL語句或命令封裝成特定於Mysql 數據庫的應用層數據包,發送給Mysql 數據庫,Mysql數據庫執行命令,將結果封裝成數據包並返回給應用,應用程序進行解析,顯示結果給客戶端。如下圖所示:
訪問數據庫的抽象層–JDBC
令人抓狂的是,Oracle, DB2,Postgresql等其他數據庫都有一套屬於自己的應用層訪問協議。 他們的網絡訪問協議和Mysql 的完全不一樣 ! 這就意味着之前寫的針對Mysql 的程序無法針對其他數據庫通用, 如果想切換數據庫, 每個程序都得另起爐竈寫一套代碼!直接使用socket訪問數據庫耦合度太高了,必須得有一個抽象層屏蔽這些細節!
爲此,JDK專門提供了一系列針對這個抽象層的統一接口—JDBC(Java Data Base Connectivity,java數據庫連接),稱爲JDBC規範。數據庫廠商需要實現JDBC規範中的某些接口(實現中應包含特定數據庫的應用層協議的轉換/解析等),這些接口統被稱爲 XX數據庫驅動 。如下圖所示
數據庫廠商實現這些接口一般以單個的jar文件發佈,如:
mysql-connector-java-5.1.40.jar
(Mysql)
ojdbc14.jar
(Oracle)
…
2. JDBC的發展
參考我的另一篇文章 link
3.JDBC的一些接口
java.sql.Connection接口
JDBC規範中用Connection接口用來代表程序和數據庫的Socket連接。數據庫廠商必須實現這個接口。
使用java.sql.Driver
JDBC規範了一個抽象層吧: Driver接口。每個數據庫都需要實現Driver 接口, 通過Driver 可以獲得特定數據庫的Connection 。 這樣就避免了直接調用特定Connection的耦合性。
Driver driver=new com.abc.Driver();
//獲取DB連接
Connection connection = driver.connect("url","user","pwd");
工廠類java.sql.DriverManager
如果要訪問多個數據庫—JDBC提供了DriverManager類,使用它可以註冊不止一個Driver,方便獲取對應數據庫Connection。你可以這樣寫:
//註冊一個數據庫驅動/如果換用其他廠商的數據庫驅動,直接在這裏換其他Driver
DriverManager.registerDriver(new com.abc.Driver());
DriverManager.registerDriver(new com.ssss.Driver());
//獲取連接
Connection connection = DriverManager.getConnection("url","user","pwd");
Driver會根據url來調用註冊在DriverManager中的每個Driver相應方法,來判斷是否支持這個url,如果是則返回特定的Connection。
進一步簡化
在JDBC4.0以後,你可以這樣寫:
Connection connection = DriverManager.getConnection("url","user","pwd");
DriverManager會自動加載ClassPath中所有的Driver實現類,而每個Driver類被加載時,會自動註冊到DriverManager中(在靜態代碼塊static{}
中實現註冊)。
4. 開發環境
JDK版本
版本1.8
IDE
InteliJ IDEA 2016
maven依賴
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.5</version>
</dependency>
數據庫信息
類型:mysql
版本: 5.7
IP: localhost
端口:3306
庫名:test
用戶名: root
密碼: 123456
表: student
表結構:
CREATE TABLE `student` (
`name` varchar(5) NOT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
5. 參考文獻
1.JDBC™ 4.2 Specification : JSR 221(Lance Andersen, Specification Lead)March 2014