JDBC4.0自动加载驱动器类

感情迁移 提交于 2020-03-14 16:47:19

关于驱动包

     jdbc中注册驱动,首先导入对应的包,例如mysql-connector-java-5.0.8-bin.jar。驱动包是java和具体数据库之间的连接桥梁,由数据库厂商开发。每一种数据库对应一款驱动jar,甚至每一个版本的数据库都有自己对应版本的驱动jar。 

 关于java.sqlDriverManger类

     Java的驱动管理类。管理一组 JDBC 驱动程序。

    javax.sql.DataSource 接口是 JDBC 2.0 API 中的新增内容,它提供了连接到数据源的另一种方法。使用 DataSource 对象是连接到数据源的首选方法。

    DiverManager.class里有个属性drivers,它实际上是一个vector(向量)。可在列表中加入很多驱动,当DriverManager去取连接的时候,若果drivers里有很多驱动,它会把drivers里面的各个驱动的url和创建连接时传进来的url逐一比较,遇到对应的url,则建立连接。 

注册驱动的三种方式: 

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

    会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。 

    具体来说就是: 
    1,加载的时候注册一次驱动(原因请看第三中注册方式),实例化的时候又注册一次。所以两次。 
    2,由于实例化了com.mysql.jdbc.Driver.class,导致必须导入该类(就是要把这个类import进去),从而具体驱动产生了依赖。不方便扩展代码。 


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

System.setProperty("jdbc.driver","com.mysql.jdbc.Driver");//系统属性指定数据库驱动.可以同时导入多个jdbc驱动,中间用冒号“:”分开 
String url="jdbc:mysql://localhost:3306/databasename";//数据库连接子协议  
Connection conn=DriverManager.getConnection(url,"username","password");

    通过系统的属性设置注册驱动

    如果要注册多个驱动,则System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver:com.oracle.jdbc.Driver"); 
虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用。 

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

Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动  
String url="jdbc:mysql://localhost:3306/databasename";//数据库连接子协议  
Connection conn=DriverManager.getConnection(url,"username","password");

    推荐这种方式,不会对具体的驱动类产生依赖( 可以在运行时动态更换数据库连接驱动 )。 

    其实这个只是把com.mysql.jdbc.Driver.class这个类装载进去,但是关键就在于,在这个类中,有个静态块,如下: 

static{ 
   try{ 
      java.sql.DriverManager.registerDriver(new Driver()); 
   }catch(SQLException e){ 
      throw new RuntimeException("can't register driver!"); 
   }
} 

    就是因为这个代码块,让类在加载的时候就把驱动注册进去了!

 

 

 

JDBC4.0自动加载驱动器类

    从JDK1.6开始,Oracle就将修改了添加了新的加载JDBC驱动的方式。即JDBC4.0。在启动项目或是服务时,会判断当前classspath中所有的jar包,并检查META-INF目录下,是否包含services文件夹,如果包含,就会将里面的配置加载成相应的服务。

    如Oracle11g的ojdbc6.jar包:META-INF/services/jdbc.sql.Driver文件内容只有一行,即实现java.sql.Driver的类:oracle.jdbc.OracleDriver

    Oracle在随即发布的mysql-connector-java-5.1.8.jar中,也同样添加了上述的特性:里面的内容,也是一句,即:com.mysql.jdbc.Driver

    为了验证是否会自动加载数据库驱动类,我们书写一段Java代码:

public static void main(String[] args) throws Exception {
        //从DriverManager中获取所有驱动类,遍历并输出
        Enumeration<java.sql.Driver> en = DriverManager.getDrivers();
        while(en.hasMoreElements()){
             java.sql.Driver d = en.nextElement();
             System.err.println(d.toString());
        }
}

    在MyEclipse或是Eclipse环境下,添加两个Jar包,分别为ojdbc6.jar的mysql-connector-5.1.8.jar:运行结果如下:

    可见,jdk1.6加载了三个驱动类。
 

    为了更好的验证此问题,我们再从命令行依次加载不同的jar包进行测试:

    第一次执行,没有指定任何的外部jar文件,可见只加载了系统的JdbcOdbcDriver;

    第二次执行:先设置ojdbc6.jar,即oracle的驱动包,可见已经自动加载了两个驱动类;

    第三次运行:再加载mysql-connector-java-5.1.18.jar(如果你用的是5.1.5你可以自己手工在jar包中的META-INF下建立一个services文件夹,然后建立一个java.sql.Driver文件,里面输入com.mysql.jdbc.Driver即可):注意以下代码中,使用%classpath%串联已经设置的classpath。

    需要说明的是,JDK6是一个聪明的设计。如果发现你已经注册过某个驱动,将不会再次为你注册这个驱动。除非你显式的调用了DriverManager.registerDriver(new SomeDriver())方法:

    以下是若干个测试:

public static void main(String[] args) throws Exception {
   DriverManager.registerDriver(new Driver());//自己通过严重依赖的方式注册一个,不建议这样做
   Enumeration<java.sql.Driver> en = DriverManager.getDrivers();
   while(en.hasMoreElements()){
      java.sql.Driver d = en.nextElement();
      System.err.println(d.toString());
   }
}

    输出结果:

 

    测试代码2:

public static void main(String[] args) throws Exception {
   Class.forName("com.mysql.jdbc.Driver");//即便是删除也会只注册一个
   Enumeration<java.sql.Driver> en = DriverManager.getDrivers();
   while(en.hasMoreElements()){
      java.sql.Driver d = en.nextElement();
      System.err.println(d.toString());
   }
}

    输出结果:

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!