JDBC4.0自动加载驱动器类

 1 JDBC4.0自动加载驱动器类
 2     从JDK1.6开始,Oracle就将修改了添加了新的加载JDBC驱动的方式。即JDBC4.0。在启动项目或是服务时,会判断当前classspath中的所的jar包,并检查META-INF目录下,是否包含services文件夹,如果包含,就会将里面的配置加载成相应的服务。
 3 如Oracle11g的ojdbc6.jar包:
 4 
 5 META-INF/services/jdbc.sql.Driver文件内容只有一行,即实现java.sql.Driver的类:
 6 oracle.jdbc.OracleDriver
 7 
 8 Oracle在随即发布的mysql-connector-java-5.1.8.jar中,也同样添加了上述的特性:
 9 
10 里面的内容,也是一句,即:
11 com.mysql.jdbc.Driver
12 
13 为了验证是否会自动加载数据库驱动类,我们书写一段Java代码:
14 public static void main(String[] args) throws Exception {
15         //从DriverManager中获取所有驱动类,遍历并输出
16         Enumeration<java.sql.Driver> en = DriverManager.getDrivers();
17         while(en.hasMoreElements()){
18             java.sql.Driver d = en.nextElement();
19             System.err.println(d.toString());
20         }
21 }
22 在MyEclipse或是Eclipse环境下,添加两个Jar包,分别为ojdbc6.jar的mysql-connector-5.1.8.jar:运行结果如下:
23 sun.jdbc.odbc.JdbcOdbcDriver@173a10f
24 oracle.jdbc.OracleDriver@e09713
25 com.mysql.jdbc.Driver@1f1fba0
26 可见,jdk1.6加载了三个驱动类。
27 
28 为了更好的验证此问题,我们再从命令行依次加载不同的jar包进行测试:
29 第一次执行,没有指定任何的外部jar文件,可见只加载了系统的JdbcOdbcDriver:
30 
31 第二次执行:先设置ojdbc6.jar,即oracle的驱动包,可见已经自动加载了两个驱动类:
32 
33 第三次运行:再加载mysql-connector-java-5.1.18.jar(如果你用的是5.1.5你可以自己手工在jar包中的META-INF下建立一个services文件夹,然后建立一个java.sql.Driver文件,里面输入com.mysql.jdbc.Driver即可):注意以下代码中,使用%classpath%串联已经设置的classpath:
34 
35 
36 需要说明的是,JDK6是一个聪明的设计。如果发现你已经注册过某个驱动,将不会再次为你注册这个驱动。除非你显式的调用了DriverManager.registerDriver(new SomeDriver())方法:
37 以下是若干个测试:
38     public static void main(String[] args) throws Exception {
39         DriverManager.registerDriver(new Driver());//自己通过严重依赖的方式注册一个,不建议这样做
40         Enumeration<java.sql.Driver> en = DriverManager.getDrivers();
41         while(en.hasMoreElements()){
42             java.sql.Driver d = en.nextElement();
43             System.err.println(d.toString());
44         }
45     }
46 输出结果:
47 sun.jdbc.odbc.JdbcOdbcDriver@66848c
48 oracle.jdbc.OracleDriver@47b480
49 com.mysql.jdbc.Driver@9931f5
50 com.mysql.jdbc.Driver@19ee1ac
51 
52 测试代码2:
53     public static void main(String[] args) throws Exception {
54         Class.forName("com.mysql.jdbc.Driver");//即便是删除也会只注册一个
55         Enumeration<java.sql.Driver> en = DriverManager.getDrivers();
56         while(en.hasMoreElements()){
57             java.sql.Driver d = en.nextElement();
58             System.err.println(d.toString());
59         }
60     }
61 结果:
62 sun.jdbc.odbc.JdbcOdbcDriver@66848c
63 oracle.jdbc.OracleDriver@47b480
64 com.mysql.jdbc.Driver@19ee1ac

 

posted @ 2015-03-05 13:58  登高一呼  阅读(1711)  评论(0编辑  收藏  举报