在建立数据库连接的上下文中,我们通常会导入所需的包,并使用Class.forName()通过调用类的类加载器加载所需的驱动程序类。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
....
....
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection(...);
我们不能简单地删除Class.forName(),如下所示: -
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import com.mysql.jdbc.*;
....
....
Connection con=DriverManager.getConnection(...);
我的问题是当一个类的依赖项由加载依赖类的同一个类加载器加载时,通过与Class.forName(className)隐式一起使用的相同机制,给出类的原因.forName()显式。只需在import语句中包含驱动程序类。 驱动程序类在遇到DriverManager.getConnection()行时是否会自动加载? com.mysql.jdbc包在import语句中。 或者我需要添加像
这样的线路Class clazz=com.mysq.jdbc.Driver.class
触发Class.forName()。
答案 0 :(得分:3)
首先,不再需要加载驱动程序类,因为Java有一个内置的服务提供程序加载机制,它可以查找类路径中的jar文件以查找可用的驱动程序。
仅导入类不足以加载它。所有导入都允许您在编译时使用其简单名称而不是其完全限定名称来引用该类。但是,如果你从未真正加载过该课程,那么它将不会做任何事情。
您确实可以在不使用反射的情况下加载类,但这意味着您需要将驱动程序作为编译时依赖项,这通常是不需要的:您不应该依赖驱动程序中特定于数据库的类,而是仅适用于标准JDBC接口。在编译类路径中没有驱动程序可以确保这一点。
答案 1 :(得分:2)
只要您的驱动程序符合JDBC 4.0 ,您就不需要Class.forName()
。
请阅读introduction on DriverManager JavaDoc了解如何处理此问题。
原因是,驱动程序仍然需要在类路径上。对Class.forName()
也是如此(否则会抛出ClassNotFoundException
答案 2 :(得分:1)
import
语句在运行时不执行任何操作。它甚至不是编译类的一部分。它只是告诉编译器在哪里寻找东西。
像Class<?> dummy = com.mysql.jdbc.Driver.class
这样的行会起作用,但是你对MySQL驱动程序JAR文件有一个编译时的依赖关系(Class.forName没有,但在宏计划中可能不是坏事)的东西)。