在进行简单的JDBC连接时,所有资源都提供相同的代码
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(driver)的返回。
答案 0 :(得分:3)
这是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文件中写入
答案 1 :(得分:2)
Class.forName()
尝试加载指定的类。在早期版本的JDBC中,这是必要的,因为Driver
类要求以这种方式加载类。这个年龄段并不需要。
不要打电话,也不会发生任何不好的事。
出于某种原因,教程和示例仍以旧方式存在。
手动加载类的唯一微小好处是,如果你没有在类路径中获得正确的类,它会准确地告诉你问题是什么。
答案 2 :(得分:1)
class.forName()使ClassLoader将类加载到内存中。 JDBC驱动程序类包含一个静态初始化程序块,它使用DriverManager注册驱动程序以供以后参考。连接时,DriverManager使用数据库参数来查找正确的驱动程序
答案 3 :(得分:0)
Class.forName("driver.class");
加载指定的JDBC驱动程序。当驱动程序加载时,它还会使用DriverManager
注册自己。因此,当您致电DriverManager#getConnection()
时,您可以通过之前加载的驱动程序建立Connection
。
当调用方法getConnection时,DriverManager将尝试从初始化时加载的驱动程序中找到合适的驱动程序,并使用与当前applet或应用程序相同的类加载器显式加载。
答案 4 :(得分:0)
使用Class.forName(..)
加载课程。大多数java.sql.Driver
实现(使用静态初始化程序)在加载类时使用java.sql.DriverManager
实现注册自己。有关详细信息,请参阅JDBC 4.1规范中的9.2节:
JDBC驱动程序必须实现
注册自身的新实例Driver
接口,并且必须实现 包含一个静态初始化程序,它将在加载驱动程序时调用。这个 初始化程序使用DriverManager
,
注册后,您可以使用该驱动程序创建连接。
然而,从JDBC 4.0(Java 6)开始,不再需要以这种方式加载符合JDBC 4.0规范的驱动程序,因为DriverManager
本身将负责使用{{定位和加载JDBC驱动程序。 3}}机制。请参阅JDBC 4.1规范的9.2.1节:
DriverManager.getConnection
方法已得到增强,可以支持 Java标准版服务提供程序机制。 JDBC 4.0驱动程序必须包含 文件META-INF/services/java.sql.Driver
。该文件包含名称 JDBC驱动程序的java.sql.Driver
实现。
答案 5 :(得分:0)
嗯,它确实有一个副作用 - 它将字符串名称指定的驱动程序加载到内存中。
在Java中,只有在实际需要使用类时才会加载类。
因此Class.forName()
将导致类加载器“读取”字节码并将类定义加载到JVM的内存中。
现在发生这种情况时,会执行此类的静态初始化块(以及驱动程序应该有一个)(它应该是静态的,因为我们实际上并不创建此类的对象)。
写入此静态初始化块,以便在DriverManager中注册驱动程序。
这是一本'按书'的解释。当然,这个API并不是那么明确且不明显。 它可以明确地做到这一点:
Driver driver = (Driver)Class.forName("com.mysql.jdbc.Drivercom.mysql.jdbc.Driver").newInstance();
DriverManager.registerDriver(driver);
自Java 6以来,不再使用此机制。 阅读here有关加载驱动程序的新方法。
希望这有帮助