不再需要Class.forName(JDBC_DRIVER)?

我已经在这里阅读了自从java 6以来你不再需要使用以下命令注册JDBC Driver:

Class.forName(JDBC_DRIVER); 

因为DriverManager使用位于系统属性“jdbc.drivers”中的路径来检索正确的驱动程序。

但是当我做以下时:

 System.out.print(System.getProperty("jdbc.drivers")); 

null被打印。

你有什么线索为什么我的应用程序正常工作? ;)

这与该系统属性无关。 Java6(和JDBC4)引入了一个称为“ 服务提供者 ”的概念,其中JVM在启动期间可以检测到已知接口的实现。 符合该标准的驱动程序将由DriverManager自动注册。 这就是Class.forName()不再需要的原因 – 但仅当驱动程序支持它时。

如果META-INF目录中的驱动程序jar文件中有services目录,则启动服务注册。 该目录需要包含一个文本文件,该文件具有在包含实现类的java.sql.Driver的JDBC驱动程序的情况下实现的接口的名称。

DriverManager的Javadocs:

作为初始化的一部分, DriverManager类将尝试加载“jdbc.drivers”系统属性中引用的驱动程序类。 这允许用户自定义其应用程序使用的JDBC驱动程序。 例如,在〜/ .hotjava / properties文件中,您可以指定:

 jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.taste.ourDriver 

这意味着应该指定系统属性。 它并没有说在注册驱动程序时类会自动填充此属性。

至于你的应用程序工作的原因,你可能想检查你是否已经调用了DriverManager#registerDriver() (尽管大多数驱动程序都不需要这样做)。 如果是,则驱动程序已注册。 否则,应用程序可能具有服务提供者文件,如上所述:

DriverManager方法getConnectiongetDrivers已得到增强,可支持Java Standard Edition Service Provider机制。 JDBC 4.0驱动程序必须包含文件META-INF/services/java.sql.Driver 。 此文件包含java.sql.Driver的JDBC驱动程序实现的名称。 例如,要加载my.sql.Driver classMETA-INF/services/java.sql.Driver文件将包含以下条目: