zoukankan      html  css  js  c++  java
  • 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的方式我们完全可以在运行的时候再动态改变。

  • 相关阅读:
    hibernate框架的搭建与简单实现增删改
    $.ajax();详解
    利用json实现数据传输
    利用ajax实现数据传输
    错误:Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp;的解决
    简单使用jstl实现敏感字替换
    实用jstl实现未登录时不能绕过登录界面的效果
    简单实用jstl实现“登录|注册”
    简单实用jstl实现代码编写
    简单使用EL进行标签的替换
  • 原文地址:https://www.cnblogs.com/chenshaogang/p/8996942.html
Copyright © 2011-2022 走看看