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

正如“Class.forName()”和“Class.forName()。newInstance()”之间的区别所解释的那样? ,Class.forName()方法执行以下操作:

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

但是,如果只是这样做,为什么要调用这个方法以便在MySQL中使用MySQL呢? 没有它我得到以下错误:

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 )。

例如,驱动程序类看起来模糊如下:

 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


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