高版本的Oracle、MySql和Postgresql也不用写,因为采用了最新的SPI技术,驱动的类名在jar包的META-INF/services/java.sql.Driver文件里。
上面这行代码可以把类路径下所有jar包中META-INF/services/java.sql.Driver文件中定义的类加载上来,此类必须继承自java.sql.Driver。
Class.forName的主要目的是初始化数据库驱动,以执行驱动的静态块代码,其实主要是DriverManager.registerDriver(driver);方法。 自己驱动包的驱动名当然开发商最清楚,所以就在发布驱动包的时候就直接配置了,所以不用再写Class.forName。
你在DriverManager的源码中可以看到一个静态块
static {
loadInitialDrivers();
println("JDBC DriverManager initialized");
}
你可以在loadInitialDrivers()方法中看到以下一段代码:
ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
Iterator driversIterator = loadedDrivers.iterator();
/* Load these drivers, so that they can be instantiated.
* It may be the case that the driver class may not be there
* i.e. there may be a packaged driver with the service class
* as implementation of java.sql.Driver but the actual class
* may be missing. In that case a java.util.ServiceConfigurationError
* will be thrown at runtime by the VM trying to locate
* and load the service.
*
* Adding a try catch block to catch those runtime errors
* if driver not available in classpath but it's
* packaged as service and that service is there in classpath.
*/
try{
while(driversIterator.hasNext()) {
driversIterator.next();
}
} catch(Throwable t) {
// Do nothing
}
return null;
ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
上面这行代码可以把类路径下所有jar包中META-INF/services/java.sql.Driver文件中定义的类加载上来,此类必须继承自java.sql.Driver。
Class.forName的主要目的是初始化数据库驱动,以执行驱动的静态块代码,其实主要是DriverManager.registerDriver(driver);方法。 自己驱动包的驱动名当然开发商最清楚,所以就在发布驱动包的时候就直接配置了,所以不用再写Class.forName。