更好的理解 - Class.forName("com.mysql.jdbc.Driver").newInstance();

jas*_*n m 7 java mysql

我遇到了这个有用的链接,代码在更新时可以很好地运行,可以点击我的网络服务器.我绝对可以做到一切.

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

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

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

谢谢

Bru*_*eis 9

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

请注意,有必要加载初始化类,这是两个不同的东西.

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

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


Jes*_*per 7

Class.forName(className)使用指定的类加载类className.

以这种方式加载JDBC驱动程序以避免必须对特定JDBC驱动程序具有编译时依赖性.这个想法是,你使用Java的JDBC API(类和接口在包中定义java.sqljavax.sql),而不必直接引用特定的JDBC驱动程序.

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

请注意,对于大多数JDBC驱动程序,不必显式创建驱动程序类的新实例; 你可以不接.newInstance()电话.

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


小智 5

所有JDBC驱动程序都有一个静态块,它使用DriverManager注册自己,而DriverManager只有静态初始化程序.

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

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

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