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