连接到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中。它在哪里?
答案 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类并仅注册驱动程序