4

在进行简单的 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) 的返回无关。

4

6 回答 6

6

Class.forName()尝试加载命名类。在 JDBC 的早期版本中,这是必要的,因为Driver该类需要以这种方式加载该类。这已经很久没有要求了。

不接电话,就不会发生任何不好的事情。

出于某种原因,教程和示例仍然沿用旧方法。

手动加载类的唯一微小好处是它可以准确地告诉您问题所在,以防您在类路径中没有正确的类。

于 2013-08-05T13:06:20.667 回答
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 可以使用 Service Provider 机制自动检测 JDBC 4.0 驱动程序。JDBC 驱动类名写在 META-INF/services/java.sql.Driver 文件中

于 2013-08-05T13:11:17.390 回答
1

class.forName() 使 ClassLoader 将类加载到内存中。JDBC 驱动程序类包含一个静态初始化程序块,该程序块将驱动程序注册到 DriverManager 以供以后参考。连接时 DriverManager 使用数据库参数查找正确的驱动程序

于 2013-08-05T13:05:56.063 回答
0

Class.forName("driver.class");加载指定的 JDBC 驱动程序。当驱动程序加载时,它也会向DriverManager. 因此,当您打电话时,DriverManager#getConnection()您可以Connection通过之前加载的驱动程序建立。

DriverManager#getConnection()

当调用 getConnection 方法时,DriverManager 将尝试从初始化时加载的驱动程序和使用与当前小程序或应用程序相同的类加载器显式加载的驱动程序中找到合适的驱动程序。

于 2013-08-05T13:01:44.633 回答
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本身将使用该ServiceLoader机制负责定位和加载 JDBC 驱动程序。请参阅 JDBC 4.1 规范的第 9.2.1 节:

DriverManager.getConnection方法已得到增强,以支持 Java 标准版服务提供者机制。JDBC 4.0 驱动程序必须包含该文件META-INF/services/java.sql.Driver。此文件包含 JDBC 驱动程序实现的名称java.sql.Driver

于 2013-08-05T13:02:03.157 回答
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 起,不应再使用此机制。在此处阅读有关加载驱动程序的新方法。

希望这可以帮助

于 2013-08-05T13:03:05.530 回答