我遇到了这个有用的代码链接,当更新到我的网络服务器时,它工作得很好。我绝对可以做任何事情。
现在,我唯一不完全理解的是Class.forName()
.
为什么要使用这个?这可以做不同的吗?这是解决其他问题的方法吗?添加参考?创建一个类作为实现/扩展另一个类?
我想完全了解发生了什么,但这是我的方式。
谢谢
我遇到了这个有用的代码链接,当更新到我的网络服务器时,它工作得很好。我绝对可以做任何事情。
现在,我唯一不完全理解的是Class.forName()
.
为什么要使用这个?这可以做不同的吗?这是解决其他问题的方法吗?添加参考?创建一个类作为实现/扩展另一个类?
我想完全了解发生了什么,但这是我的方式。
谢谢
该代码强制表示 MySQL 驱动程序的类加载和初始化。在 Java 中,除非有必要加载类,否则不会加载类。Class.forName
由于 JDBC 代码通常从不直接引用驱动程序,因此如果没有(或其他一些等效的替代方案)就不会加载它。
请注意,有必要加载和初始化类,这是两件不同的事情。
另外,请注意没有必要调用.newInstance()
——驱动程序的静态初始化程序已经将自己注册为 JDBC 驱动程序。
最后,请注意,使用Service Loader API通常不需要调用 Class.forName() 来加载驱动程序:它可以自动加载。
Class.forName(className)
加载具有指定的类className
。
JDBC 驱动程序以这种方式加载以避免编译时依赖于特定的 JDBC 驱动程序。这个想法是您使用 Java 的 JDBC API(包中定义的类和接口java.sql
)javax.sql
而不必直接引用特定的 JDBC 驱动程序。
当您让 Java 通过调用加载驱动程序类时forName
,驱动程序将自己注册以便可以使用它。
请注意,对于大多数 JDBC 驱动程序来说,没有必要显式地创建驱动程序类的新实例。你可以.newInstance()
挂断电话。
请注意,从 JDBC 版本 4.0 开始,Class.forName()
不再需要调用 - 发现驱动程序的过程已得到改进,JDBC 可以自动加载它们。
所有 JDBC 驱动程序都有一个向 DriverManager 注册自身的静态块,而 DriverManager 仅具有静态初始化程序。
MySQL JDBC 驱动程序有一个静态初始化程序,如下所示:
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
JVM 执行静态块,Driver 向 DriverManager 注册自己。您需要一个数据库连接来操作数据库。为了创建与数据库的连接,DriverManager 类必须知道您要使用哪个数据库驱动程序。它通过遍历已注册的驱动程序数组(内部是一个 Vector)并在数组中的每个驱动程序上调用 acceptURL(url) 方法来实现这一点,有效地要求驱动程序告诉它它是否可以处理 JDBC网址。
您可以使用例如:
import com.mysql.jdbc.Driver;
public class MyClass {
//[...]
public void myMethod() {
Class<Driver> clz = Driver.class;
Driver driver = clz.newInstance();
}
}
但这不是那么灵活;例如,您可以从配置文件中读取名称“com.mysql.jdbc.Driver”。也许您想使用其他驱动程序(来自 Oracle)并且您不想更改代码;在上面介绍的方式中,这是不可能的,因此正确的方法是使用Class.forName(name)
.