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

Shu*_*eng 3 java mysql jdbc

正如"Class.forName()"和"Class.forName().newInstance()"之间的区别所解释的那样,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)
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 8

它会注册它,因为它将类加载到内存中并运行类的静态初始化程序.然后,静态初始化代码调用JDBC框架,说"你好,我是JDBC驱动程序"(通过调用DriverManager.registerDriver).

例如,驱动程序类看起来依稀是这样的:

package com.example.jdbc;

import java.sql.DriverManager;

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

    // ...implementation...
}
Run Code Online (Sandbox Code Playgroud)

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


我应该注意到,正如Andreas所说,现代JDBC驱动程序不需要你这样做.