程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> jdbc中class.forname的感化

jdbc中class.forname的感化

編輯:關於JAVA

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved