jdbc中class.forname的感化。本站提示廣大學習愛好者:(jdbc中class.forname的感化)文章只能為提供參考,不一定能成為您想要的結果。以下是jdbc中class.forname的感化正文
應用JDBC時,我們都邑很天然得應用以下語句:
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
String user = "";
String psw = "";
Connection con = DriverManager.getConnection(url,user,psw);
為何說很天然呢,由於不管是網上照樣書本教程上得例子都是如許的,並且法式也確切正常運轉了,因而年夜家也就問心無愧的找葫蘆畫瓢下去了。
必定要有這一句嗎?不是的,我們完整可以用如許一句取代它:
com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();
//or:
//new com.mysql.jdbc.Driver();
String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
String user = "";
String psw = "";
Connection con = DriverManager.getConnection(url,user,psw);
年夜家能夠都看出個年夜概來了,我們只須要在挪用DriverManager的getConnection辦法之前,包管響應的Driver類曾經被加載到jvm中,而且完成了類的初始化任務就好了,而詳細是如何完成這個功效倒是沒有講求的。下面兩種辦法都可以完成這個功效,是以法式可以正常運轉。留意了,假如我們停止以下操作,法式是不克不及正常運轉的,由於如許僅僅使Driver類被裝載到jvm中,卻沒有停止響應的初始化任務。
com.mysql.jdbc.Driver driver = null;
//or:
ClassLoader cl = new ClassLoader();
cl.loadClass("com.mysql.jdbc.Driver");
我們都曉得JDBC是應用Bridge形式停止設計的,DriverManager就是個中的Abstraction,java.sql.Driver是Implementor,com.mysql.jdbc.Driver是Implementor的一個詳細完成(請參考GOF的Bridge形式的描寫)。年夜家留意了,前一個Driver是一個接口,後者倒是一個類,它完成了後面的Driver接口。
Bridge形式中,Abstraction(DriverManager)是要具有一個Implementor(Driver)的援用的,然則我們在應用進程中,並未將Driver對象注冊到DriverManager中去啊,這是怎樣回事呢?jdk文檔對Driver的描寫中有這麼一句:
When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager
哦,本來是com.mysql.jdbc.Driver在裝載完後主動幫我們完成了這一步調。源代碼是如許的:
package com.mysql.jdbc
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
// ~ Static fields/initializers
// Register ourselves with the DriverManager
//
static {
t ry {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
// ~ Constructors
/**
* Construct a new driver and register it with DriverManager
*
* @throws SQLException
* if a database error occurs.
*/
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
}
PS:改修JDBC驅動的裝載
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class clazz = cl.loadClass("com.mysql.jdbc.Driver");
clazz.newInstance();
Connection conn = DriverManager.getConnection("jdbcurl");
異樣可以履行。然則如許就多結構了一個com.mysql.jdbc.Driver實例。同Class.forName("com.mysql.jdbc.Driver")。
即:
Class.forName("com.mysql.jdbc.Driver")==cl.loadClass("com.mysql.jdbc.Driver").newInstance();
Class.forName和 ClassLoader.loadClass是兩回事,一個實例化類,一個加載類