这究竟做了什么Class.forName(“com.mysql.jdbc.Driver”)。newInstance();

时间:2013-02-23 10:01:43

标签: java mysql database class jsp

连接到MySQL数据库时,我执行以下步骤

Connection con = null;
Resultset rs = null;
Statement st = null;
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/database","root","passwp");

实际上我想知道Class.forName("com.mysql.jdbc.Driver").newInstance();声明做了什么。

Althogh这个类不在mysql.jar中。它在哪里?

5 个答案:

答案 0 :(得分:25)

Class类位于java.lang包中,因此它与java一起分发,并自动导入到每个类中。

forName()方法的作用是返回由类加载器加载的参数的Class对象。然后newInstance()方法返回该类的新实例。

那么接下来会发生什么事 Class.forName(...) 它返回com.mysql.jdbc.Driver.class。 然后在该类上调用newInstance(),该类返回类的实例,没有参数,因此它基本上调用new com.mysql.jdbc.Driver();

答案 1 :(得分:7)

如果在类路径中找到它,则初始化类"com.mysql.jdbc.Driver",这意味着驱动程序已在JDBC驱动程序管理器中注册,因为注册过程位于驱动程序类的静态初始化程序中...

您可以使用另一种方法来注册驱动程序:是使用静态DriverManager.registerDriver()方法。

答案 2 :(得分:5)

它将创建com.mysql.jdbc.Driver类的新实例,因此调用静态初始化,它将使用DriverManager注册驱动程序,以便您可以根据在第二个中使用的URL创建mysql连接线。

但是该课程应该在mysql.jar

答案 3 :(得分:5)

引自JDBC Specification,第9章第2节:

  

JDBC驱动程序必须实现Driver接口,并且   实现必须包含将被调用的静态初始化程序   当驱动程序加载时。此初始化程序注册一个新实例   使用DriverManager。

AcmeJdbcDriver提供了一个示例代码,如下所示:

public class AcmeJdbcDriver implements java.sql.Driver {
    static {
        java.sql.DriverManager.registerDriver(newAcmeJdbcDriver());
    }
}

当您致电Class.forName(String className)时,根据API文档,会发生以下情况:

  

对forName的调用(" X")会导致名为X的类被初始化。

其中初始化涉及要执行的静态块中的代码。

所以基本上,你初始化Driver类,反过来,类根据JDBC规范用java.sql.DriverManager注册自己。

请注意,这不再需要了。可以找到详细信息here

  

DriverManager方法getConnection和getDrivers一直是   已增强,以支持Java Standard Edition Service Provider   机制。 JDBC 4.0驱动程序必须包含该文件   META-INF /服务/ java.sql.Driver中。该文件包含的名称   JDBC驱动程序实现java.sql.Driver。例如,要加载   my.sql.Driver类,META-INF / services / java.sql.Driver文件   将包含条目:

my.sql.Driver
     

应用程序不再需要使用明确加载JDBC驱动程序   的Class.forName()。

答案 4 :(得分:-1)

它创建com.mysql.jdbc.Driver类的新实例并注册驱动程序。

那么接下来会发生什么事情,你打电话给Class.forName(" com.mysql.jdbc.Driver")而没有' newInstance()'它返回com.mysql.jdbc.Driver类并仅注册驱动程序