为什么我们调用Class.forname(“com.mysql.jdbc.Driver”),即使在类路径中添加了mysql.jar

时间:2014-01-18 09:53:44

标签: java mysql jdbc

为什么我们调用Class.forname(“com.mysql.jdbc.Driver”),即使在类路径中添加了mysql.jar。我认为System ClassLoader也应该加载这个类,如果没有,那么任何正文都可以描述如何定义编写驱动程序,以便在加载类路径中的类时不加载它?

5 个答案:

答案 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中,则第二次不会调用静态块。