为什么调用 Class.forName("com.mysql.jdbc.Driver") 会注册 MySQL for JDBC? [复制]

2024-01-10

正如中所解释的“Class.forName()”和“Class.forName().newInstance()”有什么区别? https://stackoverflow.com/questions/2092659/what-is-the-difference-between-class-forname-and-class-forname-newinstanc,方法 Class.forName() 执行以下操作:

调用 Class.forName(String) 返回与给定字符串名称的类或接口关联的 Class 对象

但是,如果它只是这样做,那么为什么需要调用这个方法才能将 MySQL 与 Java 一起使用呢?如果没有它,我会收到以下错误:

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/calender
    at java.sql.DriverManager.getConnection(DriverManager.java:689)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at Database.main(Database.java:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

它注册它是因为它将类加载到内存中并运行类的静态初始值设定项。然后,静态初始化程序代码调用 JDBC 框架来表示“您好,我是 JDBC 驱动程序”(通过调用DriverManager.registerDriver http://docs.oracle.com/javase/8/docs/api/java/sql/DriverManager.html#registerDriver-java.sql.Driver-).

例如,驱动程序类将看起来vaguely像这样:

package com.example.jdbc;

import java.sql.DriverManager;

public class Driver implements java.sql.Driver {
    static {
        DriverManager.registerDriver(new Driver());
    }

    // ...implementation...
}

然后当你这样做时Class.forName("com.example.jdbc.Driver"),它加载类并运行静态初始化程序,该初始化程序创建一个实例并将其注册到DriverManager.


我应该注意的是正如安德烈亚斯所说 https://stackoverflow.com/questions/32922459/why-does-calling-class-fornamecom-mysql-jdbc-driver-register-the-mysql-for-j/32922475#comment53671714_32922459,现代 JDBC 驱动程序不需要您这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么调用 Class.forName("com.mysql.jdbc.Driver") 会注册 MySQL for JDBC? [复制] 的相关文章

随机推荐