国产探花免费观看_亚洲丰满少妇自慰呻吟_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是兩碼事,一個實例化類,一個加載類

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安顺市| 肃宁县| 当阳市| 大余县| 双江| 都兰县| 吴旗县| 福海县| 曲水县| 齐河县| 台中县| 甘洛县| 收藏| 赣榆县| 鄱阳县| 潮安县| 南充市| 亚东县| 会同县| 鄂州市| 绥中县| 黄大仙区| 温泉县| 新丰县| 察哈| 岐山县| 繁昌县| 瓮安县| 翁牛特旗| 丹江口市| 通渭县| 台南县| 昌江| 泸水县| 民权县| 渭南市| 上蔡县| 保山市| 方山县| 三明市| 蒲城县|