正如"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)
它会注册它,因为它将类加载到内存中并运行类的静态初始化程序.然后,静态初始化代码调用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驱动程序不需要你这样做.
| 归档时间: |
|
| 查看次数: |
1227 次 |
| 最近记录: |