我遇到了this helpful link with code,在更新时可以很好地运行,以便点击我的网络服务器。我绝对可以做到一切。
现在,我唯一不完全理解的是Class.forName()
。
为什么要使用它?可以这样做吗?这是一个解决其他问题的工作吗?添加参考?创建一个类来实现/扩展另一个?
我想完全理解发生了什么,但这是我的方式。
谢谢
答案 0 :(得分:9)
该代码强制表示MySQL驱动程序的类加载和初始化。在Java中,除非必需该类被加载,否则不会加载类。由于JDBC代码通常永远不会直接引用驱动程序,因此如果没有Class.forName
(或其他一些等效的替代方法),它就不会被加载。
请注意,加载和初始化类都是必要的,这是两个不同的东西。
另外,请注意,没有必要调用.newInstance()
- 驱动程序的静态初始化程序已将自身注册为JDBC驱动程序。
最后请注意,使用 Service Loader API 时,通常无需调用Class.forName()来加载驱动程序:它可以自动加载。
答案 1 :(得分:7)
Class.forName(className)
使用指定的className
加载该类。
以这种方式加载JDBC驱动程序,以避免必须对特定的JDBC驱动程序具有编译时依赖性。我们的想法是使用Java的JDBC API(包java.sql
和javax.sql
中定义的类和接口),而不必直接引用特定的JDBC驱动程序。
当您让Java使用forName
调用加载驱动程序类时,驱动程序将自行注册以便可以使用它。
请注意,对于大多数JDBC驱动程序,不必显式创建驱动程序类的新实例;你可以不用.newInstance()
电话。
请注意,由于JDBC 4.0版本不再需要Class.forName()
调用 - 发现驱动程序的过程已得到改进,JDBC可以自动加载它们。
答案 2 :(得分:5)
所有JDBC驱动程序都有一个静态块,它使用DriverManager注册自己,而DriverManager只有静态初始化程序。
MySQL JDBC Driver有一个静态初始化程序,如下所示:
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
JVM执行静态块,驱动程序使用DriverManager注册自身。 您需要数据库连接来操作数据库。为了创建与数据库的连接,DriverManager类必须知道要使用哪个数据库驱动程序。它通过遍历已向其注册的驱动程序的数组(内部为Vector)并在数组中的每个驱动程序上调用acceptsURL(url)方法来实现,有效地要求驱动程序告诉它是否可以处理JDBC URL。
答案 3 :(得分:0)
您可以使用例如:
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)
。