【问题标题】:what exactly does this do Class.forName("com.mysql.jdbc.Driver").newInstance();这到底是做什么的 Class.forName("com.mysql.jdbc.Driver").newInstance();
【发布时间】:2013-02-08 23:04:19
【问题描述】:

在连接到 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();语句是做什么的。

尽管这个类不在 mysql.jar 中。它出现在哪里?

【问题讨论】:

    标签: java mysql database class jsp


    【解决方案1】:

    引自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/services/java.sql.Driver。该文件包含 java.sql.Driver 的 JDBC 驱动程序实现。例如,要加载 my.sql.Driver 类,META-INF/services/java.sql.Driver 文件 将包含条目:

    my.sql.Driver
    

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

    【讨论】:

    • 这是一个更好的解释!谢谢!
    • 因为是唯一一个提到应用程序不再需要调用 Class.forName(..) 的人而受到支持
    【解决方案2】:

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

    那么发生的情况是你调用 Class.forName("com.mysql.jdbc.Driver") 而不使用 'newInstance()' 它返回 com.mysql.jdbc.Driver 类并仅注册驱动程序

    【讨论】:

      【解决方案3】:

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

      forName() 方法所做的只是为类加载器加载的参数返回Class 对象。然后newInstance() 方法返回该类的一个新实例。

      那么发生的事情就是你打电话给 Class.forName(...) 它返回 com.mysql.jdbc.Driver.class。 然后在该类上调用newInstance(),该类返回该类的一个实例,没有参数,所以它基本上是在调用new com.mysql.jdbc.Driver();

      【讨论】:

      • 没问题,类/类的东西可能有点难以理解。 :)
      • 我投了反对票,因为尽管这在技术上是正确的,但无论如何它都无助于理解为什么在使用 jdbc 连接的上下文中使用此代码。它也没有提到这行代码不再需要。 Koray 的答案更有意义,也更及时。
      【解决方案4】:

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

      然而,该类应该在 mysql.jar 中。

      【讨论】:

      • 你不需要创建实例来运行静态块。
      【解决方案5】:

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

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

      【讨论】:

      • forName 方法有什么作用?
      • 对 forName("com.mysql.jdbc.Driver") 的调用导致名为 Driver 的类被初始化。
      • 我还有一个问题,实际上我忘记了我的 mysql 密码,我已经检查了 SO 中关于更改 mysql 密码的所有答案,但我无法找回它。你能帮我吗
      • 你说要使用DriverManager.registerDriver。你能把完整的代码贴出来
      猜你喜欢
      • 2013-10-25
      • 2023-03-14
      • 2011-01-06
      • 2023-04-06
      • 2014-01-29
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 2015-12-12
      相关资源
      最近更新 更多