国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

jdbc中class.forname的作用

2019-11-26 15:45:03
字體:
來源:轉載
供稿:網友

使用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是兩碼事,一個實例化類,一個加載類

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 清新县| 柘荣县| 衢州市| 上高县| 安国市| 龙门县| 象山县| 尼木县| 大庆市| 个旧市| 邯郸市| 彰化市| 安塞县| 巫溪县| 沽源县| 台前县| 禹州市| 柳河县| 福海县| 江陵县| 葫芦岛市| 定日县| 永定县| 美姑县| 政和县| 苍南县| 乌拉特中旗| 通江县| 嘉荫县| 延吉市| 九江市| 泊头市| 周至县| 阳谷县| 五原县| 武汉市| 康马县| 龙川县| 诸暨市| 黄骅市| 乌拉特前旗|