更好的理解 – Class.forName(“com.mysql.jdbc.Driver”)。newInstance();

我遇到了这个有用的链接,代码在更新时可以很好地运行,可以点击我的网络服务器。 我绝对可以做到一切。

现在,我唯一不完全理解的是Class.forName()

为什么要使用它? 可以这样做吗? 这是一个解决其他问题的工作吗? 添加参考? 创建一个类来实现/扩展另一个类?

我想完全理解发生了什么,但这是我的方式。

谢谢

该代码强制表示MySQL驱动程序的类加载和初始化。 在Java中,除非必须加载类,否则不会加载类。 由于JDBC代码通常永远不会直接引用驱动程序,因此如果没有Class.forName (或其他一些等效的替代方法),它就不会被加载。

请注意,有必要加载初始化类,这是两个不同的东西。

另外,请注意,不必调用.newInstance() – 驱动程序的静态初始化程序已将自身注册为JDBC驱动程序。

最后,请注意,使用Service Loader API时 ,通常不需要调用Class.forName()来加载驱动程序:它可以自动加载。

Class.forName(className)使用指定的className加载类。

以这种方式加载JDBC驱动程序以避免必须对特定JDBC驱动程序具有编译时依赖性。 我们的想法是使用Java的JDBC API(包java.sqljavax.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执行静态块,驱动程序使用DriverManager注册自身。 您需要数据库连接来操作数据库。 为了创建与数据库的连接,DriverManager类必须知道要使用哪个数据库驱动程序。 它通过遍历已向其注册的驱动程序的数组(内部为Vector)并在数组中的每个驱动程序上调用acceptsURL(url)方法来实现,有效地要求驱动程序告诉它是否可以处理JDBC URL。

您可以使用例如:

 import com.mysql.jdbc.Driver; public class MyClass { //[...] public void myMethod() { Class clz = Driver.class; Driver driver = clz.newInstance(); } } 

但这不是那么灵活; 例如,您可以从配置文件中读取名称“com.mysql.jdbc.Driver”。 也许您想要使用其他驱动程序(来自Oracle)并且您不想更改代码; 以上面介绍的方式,这是不可能的,所以正确的方法是使用Class.forName(name)