为什么我们调用Class.forname(“com.mysql.jdbc.Driver”),即使在类路径中添加了mysql.jar。我认为System ClassLoader也应该加载这个类,如果没有,那么任何正文都可以描述如何定义编写驱动程序,以便在加载类路径中的类时不加载它?
答案 0 :(得分:2)
在旧版Java版本中,DriverManager使用它来了解可用的JDBC驱动程序。现在不需要使用它,特别是当你明确地给出驱动程序类名时。
答案 1 :(得分:2)
无需从具有JDBC 4的Java 7中调用Class.forname("com.mysql.jdbc.Driver")
。
答案 2 :(得分:1)
你可以在这里阅读:What is the actual use of Class.forName("oracle.jdbc.driver.OracleDriver") while connecting to a database? ..驱动程序可能不同......概念保持不变。
答案 3 :(得分:1)
旧的Java版本,让DriverManager了解可用的JDBC驱动程序,不需要这样做。
对Class.forName("X")
的调用导致名为X的类被动态加载(在运行时)。对forName(“X”)的调用导致名为X的类被初始化(即,JVM在类加载后执行其所有静态块)。 Class.forName(“X”)返回与“X”类关联的Class对象。返回的Class对象不是“x”类本身的实例。
Class.forName("X")
加载该类(如果尚未加载)。 JVM跟踪先前已加载的所有类。此方法使用调用它的类的类加载器。 “X”是所需类的完全限定名称。
JDBC Driver Is a Good Example
您可能有使用JDBC驱动程序的经验。例如,类加载器尝试加载和链接“org.gjt.mm.mysql”包中的Driver类。如果成功,则调用静态初始化程序。
Class.forName("org.gjt.mm.mysql.Driver");
Connection con = DriverManager.getConnection(url,?myLogin", "myPassword");
答案 4 :(得分:1)
请参阅Driver类的定义,在其中注册Driver并在将类加载到JVM时调用的静态块中实例化Driver类
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
}
如果我们写
Driver dr=new Driver();
Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/massiverun","root","admin");
System.out.println("Print"+con);
然后类驱动程序将被实例化两次,并且还将调用静态块
当调用新的Driver()时。如果我们使用Class.forname("com.mysql.jdbc.Driver")
代替新的Driver()驱动程序类被实例化一次,如果已经将类加载到JVM中,则第二次不会调用静态块。