Java 为什么调用Class.forName(“com.mysql.jdbc.Driver”)会为jdbc注册mysql?

Java 为什么调用Class.forName(“com.mysql.jdbc.Driver”)会为jdbc注册mysql?,java,mysql,jdbc,Java,Mysql,Jdbc,如中所述,方法类.forName()执行以下操作: 调用Class.forName(String)返回与具有给定字符串名称的类或接口关联的类对象 但是,如果它只是这样做,那么为什么需要调用这个方法才能将MySQL与Java结合使用呢?如果没有它,我会出现以下错误: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/calender at java.sql.DriverManage

如中所述,方法类.forName()执行以下操作:

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

但是,如果它只是这样做,那么为什么需要调用这个方法才能将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驱动程序”(通过调用)

例如,驱动程序类将大致如下所示:

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



我应该注意到,现代JDBC驱动程序不需要您这样做。

您必须使用旧的驱动程序,因为所有新的JDBC驱动程序都将自动注册,而无需调用
Class.forName
。我在哪里可以下载新的MySQL驱动程序?我能看到的最新版本是MySQL网站上的5.0.8:。目前5.1.36.5.0.8是从2007-10-09开始的。有点过时。很好的解释:)