JDBC中Class.forName()的作用以及實現jdbc驅動

Class.forName()的作用僅僅是加載一個類,並且返回該類對應的一個class對象。

原本是用來做反射時使用的類和方法,但是在jdbc中爲什麼需要使用呢?

 

這個不得不提到jdbc的機制,jdbc本身僅僅是一套接口,接口中是沒有實現數據庫的連接的,同時,jdbc使用DriverManager類來代理真正的Driver類,真正的連接的實現需要依靠數據庫廠商提供的jdbc驅動包。

當我們導入驅動jar包之後,需要通過class.forName()來加載驅動Driver類注入到JDBC的DriverManager類中。

那麼實現的方式是什麼?

 

實際上,Class.forName()僅僅只是加載了一個類,但是,一個類被虛擬機加載之後,會執行靜態代碼塊

 

在明白了JDBC驅動加載的流程之後,我們就可以自己寫一個jdbc的驅動包了。

 

所以,這裏我們可以模擬一下jdbc驅動包。

一、實現jdbc驅動必不可少的Driver類

因爲java.sql.Driver接口的抽象方法實在太多,這裏只演示測試用的代碼,其他非關鍵代碼不會貼出

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.DriverPropertyInfo;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.Properties;
import java.util.logging.Logger;

public class MyDriver implements Driver{
	static {
		//在靜態代碼塊中註冊MyDriver
		try {
			DriverManager.registerDriver(new MyDriver());
			System.out.println("註冊MyDriver到DriverManager");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

    @Override
	public Connection connect(String url, Properties info) throws SQLException {
		// TODO Auto-generated method stub
		System.out.println("MyDriver產生一個假的Connection對象");
		return new MyConnection();
	}

}

 

這個是Connection的模擬類

import java.sql.Array;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.NClob;
import java.sql.PreparedStatement;
import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;

public class MyConnection implements Connection{
	
	@Override
	public PreparedStatement prepareStatement(String sql) throws SQLException {
		System.out.println("MyDriver產生一個假的PreparedStatement對象");
		return null;
	}
}

 

現在來測試一下我們的假驅動吧

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Demo2 {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //加載驅動
		Class.forName("com.yc.test.MyDriver");
        //創建連接
		Connection conn = DriverManager.getConnection("iris");
        //獲取Statement
		System.out.println(conn.prepareStatement("sql"));
	}

}

運行結果:

順便貼一下DriverManager的簡單實現,實際上的實現套用的設計模式更多,這裏就當做僞代碼參考一下就好

package com.yc.test;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.SQLException;
import java.util.Properties;

public class MyDriverManager {
	private static Driver driver;
	//註冊驅動
	public static void registerDriver(Driver driver){
		MyDriverManager.driver = driver;
	}
	//獲取連接
	public static Connection getConnection(String url,String user,String pwd) throws SQLException{
		Properties pro = new Properties();
		pro.setProperty("user", user);
		pro.setProperty("password", pwd);
		return driver.connect(url,pro);
	}
	
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章