jdbc加载驱动方法

Posted chensg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的方式我们完全可以在运行的时候再动态改变。

以上是关于jdbc加载驱动方法的主要内容,如果未能解决你的问题,请参考以下文章

在用jdbc的时候,加载驱动类前为啥要下载ojdbc6.jar包或者ojdbc14.jar包。

如何通过 registerDriver() 方法加载 type-2 JDBC 驱动程序?

mysql jdbc驱动不能加载问题

加载数据库驱动程序的方法和JDBC的流程

加载驱动方法

java 怎么加载oracle驱动