Java開發筆記(一百四十六)JDBC的應用原理

關係數據庫使得海量信息的管理成爲現實,但各家數據庫提供的編程接口不盡相同,就連SQL語法也有所差別,像Oracle、MySQL、SQL Server都擁有本身的開發規則,假若Java針對每一個數據庫單獨作一套方法,這些數據庫操做方法將變得又龐大又冗餘。爲了解決不一樣數據庫各自爲政的問題,Java設計了統一的JDBC規範,只要程序員按照JDBC的方法操做,那麼無論什麼數據庫都能在JDBC框架下正常處理。
JDBC全稱「Java DataBase Connectivity」,意思是Java語言的數據庫鏈接管理。JDBC由JDK內部的數據庫管理工具類組成,它提供了標準的數據庫操做方法,幫助程序員使用統一的方式開展數據庫編程,從而提升了數據庫編程的開發效率。然而由於JDBC屏蔽了相關的內部細節,因此在操做具體數據庫以前,須要額外引入對應的數據庫鏈接器,也就是導入該數據庫的jar包。
以MySQL爲例,它的Java版本鏈接器可前往官網下載,下載頁面是https://dev.mysql.com/downloads/connector/j/,在該頁面的下方選擇操做系統「Platform Independent」以後,會顯示兩種壓縮包(tar.gz格式與zip格式),在其中一種的右邊單擊Download按鈕開始下載。下載完畢將文件解壓,找到裏面的Java鏈接器如mysql-connector-java-8.0.16.jar,把jar文件添加到Java工程的依賴庫,以後便可在Java代碼中操做MySQL數據庫了。
對於每一個數據庫來講,JDBC都要求提供下列四個要素:
一、數據庫的驅動:要鏈接哪一種數據庫,Oracle仍是MySQL,這得經過驅動名稱來區分。MySQL的驅動類型是com.mysql.cj.jdbc.Driver。
二、數據庫的鏈接地址:如同http地址那樣,數據庫也有入口的訪問地址,該地址包含協議、IP、端口、數據庫實例等信息。就MySQL而言,它的鏈接地址格式形如「jdbc:mysql://IP地址:端口號/數據庫實例名稱」,注意新版的MySQL還需在地址後面補充時區信息,不然運行會報錯。下面是一個完整的MySQL鏈接地址例子:html

    jdbc:mysql://localhost:3306/study?serverTimezone=GMT%2B8

 

三、數據庫的用戶名:登陸數據庫時候的用戶名稱,不一樣用戶擁有不一樣的權限。
四、數據庫的密碼:與用戶名對應的密碼,登陸之時會校驗用戶名與密碼是否正確。
只有正確提供上述四個要素,方能經過JDBC鏈接指定的數據庫。完整的鏈接過程分紅兩個步驟:加載數據庫驅動、根據用戶名和密碼鏈接數據庫,分別介紹以下:
一、加載數據庫驅動
因爲數據庫的驅動以字符串展示,所以必須藉助於反射技術加載驅動,加載數據庫驅動的代碼示例以下:java

		String driver_class = "com.mysql.cj.jdbc.Driver"; // 數據庫的驅動類
		try {
			Class.forName(driver_class); // 加載數據庫的驅動(包含初始化動做)
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

 

正常狀況下,程序只要在運行時加載一次驅動,加載動做自己包含了初始化操做,後續就沒必要重複加載驅動了。mysql

二、根據用戶名和密碼鏈接數據庫
鏈接數據庫的本質是獲取該數據庫的可用鏈接,調用DriverManager管理類的getConnection方法,輸入鏈接地址、用戶名、密碼三個參數,校驗經過便可得到當前的數據庫鏈接,也就是Connection對象。獲取數據庫鏈接的代碼例子以下所示:程序員

		// 數據庫的鏈接地址。MySQL須要在地址後面添加時區,不然會報錯
		String dbUrl = "jdbc:mysql://localhost:3306/study?serverTimezone=GMT%2B8";
		String dbUserName = "root"; // 數據庫的用戶名
		String dbPassword = "222@@@wwwWWW"; // 數據庫的密碼
		try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) {
			// 此處省略了詳細的數據庫操做代碼
		} catch (SQLException e) {
			e.printStackTrace();
		}

上面代碼之因此將Connection對象的賦值動做放到try的圓括號內部,是由於Connection類實現了AutoCloseable接口,意味着只要把它放入try語句,那麼不管是否發生異常,系統都會自動調用close方法關閉數據庫鏈接。除了close方法,Connection還提供了下面幾個方法:sql

isClosed:獲取數據庫的鏈接狀態,返回true表示鏈接已關閉,返回false表示鏈接未關閉。
getCatalog:獲取該鏈接的數據庫實例名稱。
getAutoCommit: 獲取數據庫的自動提交標誌。若是該標誌設置爲true,則每次執行一條SQL語句,系統都會自動提交該語句的修改內容。
setAutoCommit:設置自動提交的標誌,默認爲true表示自動提交。
commit:提交數據庫的修改。
rollback:回滾數據庫的修改。注意要先關閉自動提交,才能經過rollback方法回滾事務。不然報錯「Can't call rollback when autocommit=true」。
createStatement:建立數據庫操做的執行報告。
prepareStatement:建立數據庫操做的預備報告。
接下來把以上兩個鏈接步驟串起來,造成如下的數據庫鏈接代碼:數據庫

		String driver_class = "com.mysql.cj.jdbc.Driver"; // 數據庫的驅動類
		// 數據庫的鏈接地址。MySQL須要在地址後面添加時區,不然會報錯
		String dbUrl = "jdbc:mysql://localhost:3306/study?serverTimezone=GMT%2B8";
		String dbUserName = "root"; // 數據庫的用戶名
		String dbPassword = "222@@@wwwWWW"; // 數據庫的密碼
		try {
			Class.forName(driver_class); // 加載數據庫的驅動(包含初始化動做)
			// 根據鏈接地址、用戶名、密碼來獲取數據庫的鏈接
			try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) {
				String desc = String.format("數據庫%s的鏈接狀態爲「%s」,已%s自動提交。", 
						conn.getCatalog(), // 獲取該鏈接的數據庫實例名稱
						conn.isClosed() ? "關閉" : "連上", // 獲取數據庫的鏈接狀態
						conn.getAutoCommit() ? "開啓" : "關閉" // 獲取數據庫的自動提交標誌
				);
				System.out.println(desc);
			} catch (SQLException e) {
				e.printStackTrace();
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

 

運行上面的鏈接代碼,觀察到下面的輸出日誌,由日誌可見成功連上了MySQL數據庫。編程

數據庫study的鏈接狀態爲「連上」,已開啓自動提交。  



更多Java技術文章參見《Java開發筆記(序)章節目錄框架

相關文章
相關標籤/搜索