Java Class.forName,JDBC连接加载驱动程序
在进行一个简单的JDBC连接时,所有的参考资料都给出了与之相同的代码Java Class.forName,JDBC连接加载驱动程序,java,mysql,jdbc,Java,Mysql,Jdbc,在进行一个简单的JDBC连接时,所有的参考资料都给出了与之相同的代码 String driver = "com.mysql.jdbc.Driver"; Statement statement = null; Class.forName(driver); Connection conn = DriverManager.getConnection(url + dbName,userName, password); 但我们实际上与“Class.forName(driver)”无关。我们没有把它
String driver = "com.mysql.jdbc.Driver";
Statement statement = null;
Class.forName(driver);
Connection conn = DriverManager.getConnection(url + dbName,userName, password);
但我们实际上与“Class.forName(driver)”无关。我们没有把它存放在任何地方。
当我们不处理Class.forName(驱动程序)的返回时,这有什么用呢 Class.forName(“driver.Class”)代码>加载指定的JDBC驱动程序。当驱动程序加载时,它也会向DriverManager
注册自身。因此,当调用DriverManager#getConnection()
时,可以通过之前加载的驱动程序建立连接
调用方法getConnection时,DriverManager将尝试从初始化时加载的驱动程序和使用与当前小程序或应用程序相同的类加载器显式加载的驱动程序中查找合适的驱动程序
使用Class.forName(..)
加载类。加载类时,大多数java.sql.Driver
实现(使用静态初始值设定项)将自己注册到java.sql.DriverManager
实现中。详见JDBC 4.1规范第9.2节:
JDBC驱动程序必须实现驱动程序
接口,并且实现必须
包含加载驱动程序时将调用的静态初始值设定项。这
初始值设定项向DriverManager
注册自身的新实例
注册后,您可以使用该驱动程序创建连接
但是,从JDBC 4.0(Java 6)开始,不再需要以这种方式加载符合JDBC 4.0规范的驱动程序,因为DriverManager
本身将负责使用该机制定位和加载JDBC驱动程序。见JDBC 4.1规范第9.2.1节:
DriverManager.getConnection
方法已得到增强,以支持
Java标准版服务提供程序机制。JDBC4.0驱动程序必须包括
文件META-INF/services/java.sql.Driver
。此文件包含
JDBC驱动程序对java.sql.driver
的实现
嗯,它确实有一个副作用——它将字符串名指定的驱动程序加载到内存中
在Java中,类只有在实际需要使用时才被加载
因此Class.forName()
将导致类加载器“读取”字节码,并将类定义加载到JVM的内存中
现在,当这种情况发生时,这个类的静态初始化块(驱动程序应该有一个)被执行(它应该是静态的,因为我们没有真正创建这个类的对象)
写入此静态初始化块,以便在DriverManager中注册驱动程序
这是一个“按部就班”的解释。当然,这个API不是那么清晰和明显。
可以明确地做到这一点:
Driver driver = (Driver)Class.forName("com.mysql.jdbc.Drivercom.mysql.jdbc.Driver").newInstance();
DriverManager.registerDriver(driver);
因为Java6,所以不应该再使用这种机制了。
了解加载驱动程序的新方法
希望这有助于类。forName()使类加载器将类加载到内存中。JDBC驱动程序类包含一个静态初始值设定项块,它向DriverManager注册驱动程序以供以后参考。连接时,DriverManager使用数据库参数查找正确的驱动程序。forName()
尝试加载指定的类。在早期版本的JDBC中,这是必要的,因为驱动程序
类要求以这种方式加载类。这已经很久没有被要求了
不打电话就不会有什么不好的事情发生
出于某种原因,教程和示例仍然沿用旧方法
手动加载类的唯一微小好处是,如果在类路径中没有正确的类,它会准确地告诉您问题所在。这是com.mysql.jdbc.Driver的一部分,它向DriverManager注册自身
//
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
应该注意的是,由于1.6版没有必要使用Class.forName()显式加载JDBC驱动程序,DriverManager可以使用服务提供程序机制自动检测JDBC 4.0驱动程序。JDBC驱动程序类名写在META-INF/services/java.sql.Driver文件中您可以阅读以下文章:谢谢@刚才我很清楚。我正在使用JavaEE8,但是没有Class.forName(“mysqlmodule”)我仍然无法建立连接