jdbc加載驅動方法


1.Class.forName("com.mysql.jdbc.Driver");

2. DriverManager.registerDriver(new com.mysql.jdbc.Driver());

3.System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");

 

DriverManager.registerDriver和 Class.forName()的異同

 

 那么這兩種方式有什么異同呢?首先我們到DriverManager中去看一下,

Java代碼  
  1.    public static synchronized void registerDriver(java.sql.Driver driver)  
  2. throws SQLException {  
  3. if (!initialized) {  
  4.     initialize();  
  5. }  
  6.        
  7. DriverInfo di = new DriverInfo();  
  8.   
  9. di.driver = driver;  
  10. di.driverClass = driver.getClass();  
  11. di.driverClassName = di.driverClass.getName();  
  12.   
  13. // Not Required -- drivers.addElement(di);  
  14.   
  15. writeDrivers.addElement(di);   
  16. println("registerDriver: " + di);  
  17.   
  18. /* update the read copy of drivers vector */  
  19. readDrivers = (java.util.Vector) writeDrivers.clone();  
  20.   
  21.    }  

      很明顯,DriverManager將我們需要注冊的驅動程序信息封裝成DriverInfo放進了一個writeDrivers中,這個writeDrivers是DriverManager中聲明的一個static類型Vector變量。在getConnection的時候會再用到。

       那么Class.forName("com.mysql.jdbc.Driver")是如何注冊驅動程序的呢,我們知道Class.forName("類名")的主要作用是向虛擬機實例化一個Class實例,我們看一下com.mysql.jdbc.Driver的源代碼。

Java代碼  
  1. public class Driver extends NonRegisteringDriver implements java.sql.Driver {  
  2.     // ~ Static fields/initializers  
  3.     // ---------------------------------------------  
  4.   
  5.     //  
  6.     // Register ourselves with the DriverManager  
  7.     //  
  8.     static {  
  9.         try {  
  10.             java.sql.DriverManager.registerDriver(new Driver());  
  11.         } catch (SQLException E) {  
  12.             throw new RuntimeException("Can't register driver!");  
  13.         }  
  14.     }  

        在 com.mysql.jdbc.Driver中有一段靜態代碼塊,是向 DriverManager注冊一個Driver實例。這樣在Class.forName("com.mysql.jdbc.Driver")的時候,就會首先去執行這個靜態代碼塊,於是和DriverManager.registerDriver(new Driver())有了相同的效果。

         那么對於這兩種方法,在這里,我推薦使用第二種,即Class.forName("類名")的方式。原因有兩點

1、在我們執行DriverManager.registerDriver(new Driver())的時候,靜態代碼塊也已經執行了,相當於是實例化了兩個Driver對象。

2、 DriverManager.registerDriver(new Driver())產生了一種對MySQL的一種依賴。而Class.forName的方式我們完全可以在運行的時候再動態改變。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM