8

我遇到了这个有用的代码链接,当更新到我的网络服务器时,它工作得很好。我绝对可以做任何事情。

现在,我唯一不完全理解的是Class.forName().

为什么要使用这个?这可以做不同的吗?这是解决其他问题的方法吗?添加参考?创建一个类作为实现/扩展另一个类?

我想完全了解发生了什么,但这是我的方式。

谢谢

4

4 回答 4

11

该代码强制表示 MySQL 驱动程序的类加载和初始化。在 Java 中,除非有必要加载类,否则不会加载类。Class.forName由于 JDBC 代码通常从不直接引用驱动程序,因此如果没有(或其他一些等效的替代方案)就不会加载它。

请注意,有必要加载初始化类,这是两件不同的事情。

另外,请注意没有必要调用.newInstance()——驱动程序的静态初始化程序已经将自己注册为 JDBC 驱动程序。

最后,请注意,使用Service Loader API通常不需要调用 Class.forName() 来加载驱动程序:它可以自动加载。

于 2012-10-17T11:19:37.190 回答
7

Class.forName(className)加载具有指定的类className

JDBC 驱动程序以这种方式加载以避免编译时依赖于特定的 JDBC 驱动程序。这个想法是您使用 Java 的 JDBC API(包中定义的类和接口java.sqljavax.sql而不必直接引用特定的 JDBC 驱动程序。

当您让 Java 通过调用加载驱动程序类时forName,驱动程序将自己注册以便可以使用它。

请注意,对于大多数 JDBC 驱动程序来说,没有必要显式地创建驱动程序类的新实例。你可以.newInstance()挂断电话。

请注意,从 JDBC 版本 4.0 开始,Class.forName()不再需要调用 - 发现驱动程序的过程已得到改进,JDBC 可以自动加载它们。

于 2012-10-17T11:25:38.557 回答
5

所有 JDBC 驱动程序都有一个向 DriverManager 注册自身的静态块,而 DriverManager 仅具有静态初始化程序。

MySQL JDBC 驱动程序有一个静态初始化程序,如下所示:

static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}

JVM 执行静态块,Driver 向 DriverManager 注册自己。您需要一个数据库连接来操作数据库。为了创建与数据库的连接,DriverManager 类必须知道您要使用哪个数据库驱动程序。它通过遍历已注册的驱动程序数组(内部是一个 Vector)并在数组中的每个驱动程序上调用 acceptURL(url) 方法来实现这一点,有效地要求驱动程序告诉它它是否可以处理 JDBC网址。

于 2012-10-17T11:25:04.240 回答
0

您可以使用例如:

import com.mysql.jdbc.Driver;

public class MyClass {
   //[...]
   public void myMethod() {
        Class<Driver> clz = Driver.class;
        Driver driver = clz.newInstance();
   }
}

但这不是那么灵活;例如,您可以从配置文件中读取名称“com.mysql.jdbc.Driver”。也许您想使用其他驱动程序(来自 Oracle)并且您不想更改代码;在上面介绍的方式中,这是不可能的,因此正确的方法是使用Class.forName(name).

于 2012-10-17T11:24:18.023 回答