1. 程式人生 > 資料庫 >JDBC(Java Data Base Connectivity,java資料庫連線)

JDBC(Java Data Base Connectivity,java資料庫連線)

個人部落格導航頁(點選右側連結即可打開個人部落格):大牛帶你入門技術棧 

JDBC是一種用於執行SQL語句的Java API,可以為多種關係資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。

Java資料庫連線體系結構是用於Java應用程式連線資料庫的標準方法,JDBC對Java程式設計師而言是API,對實現與資料庫連線的服務提供商而言是介面模型。作為API,JDBC為程式開發提供標準的介面,併為資料庫廠商及第三方中介軟體廠商實現與資料庫的連線提供了標準方法。

通常一個數據庫廠商在推出自己的資料庫產品的時候都會提供一套訪問資料庫的API,這些API可以用各種語言的形式提供,客戶端應用程式呼叫這些API來訪問資料庫。每一個廠商提供的API都不相同,導致了使用某一個特定的資料庫的程式不能移植到另一個數據庫上。JDBC以Java類庫來取代資料庫廠商的專有API,客戶端只需要呼叫JDBC API,由JDBC驅動程式(第三方資料庫廠商實現Java JDBC標準而定義的特定於某一資料庫操作的API)去處理與資料庫的通訊。

應用:

使用某種資料庫持久化資料要匯入相應的資料庫驅動包。
主要資料庫JDBC驅動的類名:
SQL Server:com.microsoft.jdbc.sqlserver.SQLServerDriver
MySQL:com.mysql.jdbc.Driver
Oracle:oracle.jdbc.driver.OracleDriver

1、首先我們一般要載入並註冊資料庫驅動,有以下三種方式可以做到這一點:
     ①、Class.forName("JDBC驅動類名") //通過反射機制載入註冊驅動,常用
     ②、System.setProperty("jdbc.driver","JDBC驅動類名");//設定系統屬性指定資料庫驅動

     ③、DriverManager.registerDriver(new com.mysql.jdbc.Driver());

     總結:推薦①,和②兩種方式。
     原因:③在編譯時需要匯入對應的lib。①,②不需要。
     第②種方式的話,可以同時匯入多個jdbc驅動,中間用冒號“:”分開
     比如System.setProperty("jdbc.drivers","XXXDriver:XXXDriver:XXXDriver");
     這樣就一次註冊了三個資料庫驅動

     在呼叫Class.forName(“XXXDriver”)時,完成了將具體的驅動程式向JDBC API中驅動管理器DriverManager

     的註冊,該 註冊方法在類構造完成前完成,一般使用靜態語句塊,
     通過檢視MySQL的驅動實現com.mysql.jdbc.Driver類可以看到

static {
  	try {
		java.sql.DriverManager.registerDriver(new Driver());
	} catch (SQLException E) {
		throw new RuntimeException("Can't register driver!");
	}
}


     在呼叫DriverManager的getConnection方法時,一般先在已註冊的驅動中查詢可以瞭解此URL的驅動, 
     然後呼叫該驅動的connect方法,從而建立連線,返回的連線都是一個實現java.sql.Connection介面的具體類。

 

     JDBC標準中的Driver介面:
     JDBCDriverInterface

     它是任何資料庫提供商的驅動類必須實現的介面,驅動類必須實現該介面中的所有方法!

     MySQL驅動類Driver原始碼: 

 

package com.mysql.jdbc;

import java.sql.SQLException;

/**
 * The Java SQL framework allows for multiple database drivers. Each driver
 * should supply a class that implements the Driver interface
 * 
 * <p>
 * The DriverManager will try to load as many drivers as it can find and then
 * for any given connection request,it will ask each driver in turn to try to
 * connect to the target URL.
 * 
 * <p>
 * It is strongly recommended that each Driver class should be small and
 * standalone so that the Driver class can be loaded and queried without
 * bringing in vast quantities of supporting code.
 * 
 * <p>
 * When a Driver class is loaded,it should create an instance of itself and
 * register it with the DriverManager. This means that a user can load and
 * register a driver by doing Class.forName("foo.bah.Driver")
 */
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
	// ~ Static fields/initializers
	// ---------------------------------------------

	//
	// Register ourselves with the DriverManager
	//
	static {
		try {
			java.sql.DriverManager.registerDriver(new Driver());
		} catch (SQLException E) {
			throw new RuntimeException("Can't register driver!");
		}
	}
	
	/**
	 * Construct a new driver and register it with DriverManager
	 */
	public Driver() throws SQLException {
		// Required for Class.forName().newInstance()
	}
}

 

2、從DriverManager中的到一個DBMS連線,DriverManager類是整個JDBC的起點!利用它可以建立連線,
     從而完成後續的操作。呼叫DriverManager類的getConnection(String url,String user,String pwd)建立到
     資料庫的連線,返回一個連線物件。

     常見的url:
     SQL Server :jdbc:microsoft:sqlserver://localhost:1443;databasename=資料庫名
     Oracle :jdbc:oracle:thin:@localhost:1521:ORCL(資料庫例項名)
     MySQL :jdbc:mysql://localhost:3306:/databasename
     Jdbc-odbc橋 :jdbc:odbc:test(test為odbc資料來源名稱)

 

public class DBUtil {
	
	private static String url = "jdbc:mysql://localhost:3306/spring";
	private static String user = "root";
	private static String pwd = "mysql5";
	private static Connection conn = null;
	
	static {
		try {
			//使用Class.forName()載入並註冊JDBC驅動程式
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public static Connection getConnection() {
		try {
			//載入 Driver 類並在 DriverManager 類中註冊後,它們即可用來與資料庫建立連線。
			//當呼叫 DriverManager.getConnection 方法發出連線請求時,
			//DriverManager 將檢查每個驅動程式,檢視它是否可以建立連線。
			conn = DriverManager.getConnection(url,user,pwd);
		} catch (SQLException e) {
			e.printStackTrace();
		} 
		
		return conn;
	}
	
	public static void closeConn() {
		try {
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

 

3、訪問資料庫進行CRUD操作,對資料庫操作的介面類一般都位於java.sql包和javax.sql包下。
     資料庫連線被用於向資料庫伺服器傳送命令和SQL語句。

常用的資料庫操作介面類:

DriverManager:

public class DriverManager extends Object

管理一組 JDBC 驅動程式的基本服務。
在呼叫 getConnection 方法時,DriverManager 會試著從初始化時載入的那些驅動程式以及使用與當前 applet 或應用程式相同的類載入器顯式載入的那些驅動程式中查詢合適的驅動程式。

Connection:

public interface Connection extends Wrapper

與特定資料庫的連線(會話)。在連線上下文中執行 SQL 語句並返回結果。
注:在配置 Connection 時,JDBC 應用程式應該使用適當的 Connection 方法,比如 setAutoCommit 或 setTransactionIsolation。在有可用的 JDBC 方法時,應用程式不能直接呼叫 SQL 命令更改連線的配置。預設情況下,Connection 物件處於自動提交模式下,這意味著它在執行每個語句後都會自動提交更改。如果禁用了自動提交模式,那麼要提交更改就必須顯式呼叫 commit 方法;否則無法儲存資料庫更改。

Statement:

public interface Statement extends Wrapper

用於執行靜態 SQL 語句並返回它所生成結果的物件。
Statement 物件用來將 SQL 語句傳送到資料庫。不帶引數的 SQL 語句通常使用 Statement 物件執行。如果多次執行相同的 SQL 語句,使用 PreparedStatement 物件可能更有效。

PreparedStatement:

public interface PreparedStatement extends Statement

表示預編譯的 SQL 語句的物件。 
SQL 語句被預編譯並存儲在 PreparedStatement 物件中。然後可以使用此物件多次高效地執行該語句。因此多次執行的 SQL 語句經常建立為 PreparedStatement 物件,以提高效率。 
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?"); 
pstmt.setBigDecimal(1,153833.00) 
pstmt.setInt(2,110592)
resultset rs = pstmt.executequery();

ResultSet:

public interface ResultSet extends Wrapper

表示資料庫結果集的資料表,通常通過執行查詢資料庫的語句生成。 
ResultSet 物件具有指向其當前資料行的游標。最初,游標被置於第一行之前。next 方法將游標移動到下一行;因為該方法在 ResultSet 物件沒有下一行時返回 false,所以可以在 while 迴圈中使用它來迭代結果集。

附Java/C/C++/機器學習/演算法與資料結構/前端/安卓/Python/程式設計師必讀/書籍書單大全:

(點選右側 即可打開個人部落格內有乾貨):技術乾貨小棧
=====>>①【Java大牛帶你入門到進階之路】<<====
=====>>②【演算法資料結構+acm大牛帶你入門到進階之路】<<===
=====>>③【資料庫大牛帶你入門到進階之路】<<=====
=====>>④【Web前端大牛帶你入門到進階之路】<<====
=====>>⑤【機器學習和python大牛帶你入門到進階之路】<<====
=====>>⑥【架構師大牛帶你入門到進階之路】<<=====
=====>>⑦【C++大牛帶你入門到進階之路】<<====
=====>>⑧【ios大牛帶你入門到進階之路】<<====
=====>>⑨【Web安全大牛帶你入門到進階之路】<<=====
=====>>⑩【Linux和作業系統大牛帶你入門到進階之路】<<=====

天下沒有不勞而獲的果實,望各位年輕的朋友,想學技術的朋友,在決心扎入技術道路的路上披荊斬棘,把書弄懂了,再去敲程式碼,把原理弄懂了,再去實踐,將會帶給你的人生,你的工作,你的未來一個美夢。