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);
}
}