这究竟做的Class.forName(“com.mysql.jdbc.Driver”)的newIns

2019-08-17 03:25发布

当连接到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。 它在哪里存在?

Answer 1:

所述Class类位于java.lang包,所以它被分配用java,和自动导入每个类。

在什么forName()方法做,只是返回的Class对象,是由类加载器加载的paramater。 所述newInstance()方法,然后返回类的新实例。

那么接下来会发生什么是你调用Class.forName(...)返回com.mysql.jdbc.Driver.class。 然后调用newInstance()对类返回类的一个实例,蒙山没有PARAMATERS,所以它基本上调用new com.mysql.jdbc.Driver();



Answer 2:

它初始化类"com.mysql.jdbc.Driver"如果在classpath中发现,这意味着司机被注册在JDBC驱动程序管理,因为注册过程是驱动器类的静态初始化中...

还有就是你可以用它来注册驱动程序的另一种方法:是使用静态DriverManager.registerDriver()方法。



Answer 3:

这将创建一个新的实例com.mysql.jdbc.Driver类,因此调用静态初始化将注册与司机DriverManager ,所以你可以根据你在第二行使用URL创建MySQL连接。

然而,类应该在mysql.jar



Answer 4:

从引用JDBC规范 ,第9章,第2章:

JDBC驱动程序必须实现驱动程序接口,并且该实现必须包含一个静态初始化加载驱动程序时,将调用。 这初始化向DriverManager注册自己的新实例。

和示例代码提供了一种用于AcmeJdbcDriver如下:

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

而当你调用的Class.forName(字符串的className) ,根据API文档,将出现以下情况:

到的forName(“X”)的调用会导致类名为X被初始化。

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

所以基本上,你初始化驱动程序类,并依次类本身与注册java.sql.DriverManager每个JDBC规范。

请注意,这不是不再需要。 详情可参阅这里 。

类DriverManager方法的getConnection和getDrivers已得到增强,支持Java标准版服务提供商的机制。 JDBC 4.0驱动程序必须包含文件META-INF /服务/ java.sql.Driver中。 此文件包含JDBC驱动程序实现java.sql.Driver中的名称。 例如,加载my.sql.Driver类中,META-INF /服务/ java.sql.Driver文件需要包含下面的条目:

 my.sql.Driver 

应用程序不再需要显式地加载使用Class.forName JDBC驱动程序()。



Answer 5:

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

那么接下来发生的事情是,你调用Class.forName(“com.mysql.jdbc.Driver”)没有'的newInstance()返回com.mysql.jdbc.Driver类,只有注册驱动程序



文章来源: what exactly does this do Class.forName(“com.mysql.jdbc.Driver”).newInstance();