【问题标题】:What does forName() method in the Class class do, when loading jdbc:odbc driver?加载 jdbc:odbc 驱动程序时,Class 类中的 forName() 方法有什么作用?
【发布时间】:2012-11-23 16:49:46
【问题描述】:

我正在学习使我的 Java 应用程序能够与 MS Access 数据库进行通信。

我不确定一种方法,Class.forName() 方法。我传递的参数是“sun.jdbc.odbc.JdbcOdbcDriver”,它加载了jdbc:odbc 网桥来访问数据库。

Class.forName() 究竟做了什么,为什么需要它?

非常感谢。

【问题讨论】:

  • 只是在这里补充,严格来说不是需要。假设驱动程序有一个可以使用的构造函数,您可以使用DriverManager.registerDriver(new Driver()) 达到相同的效果。
  • 请注意,对于 JDBC 4.0+ 驱动程序(自 Java SE 6 起),这不再是必需的:docs.oracle.com/javase/7/docs/api/java/sql/DriverManager.html
  • @IanMcLaird 大多数驱动程序会在加载类时自己调用DriverManager.registerDriver;最终用户几乎不需要自己调用 registerdriver;在本例中,new Driver() 本身会加载并注册驱动程序。

标签: java database jdbc odbc driver


【解决方案1】:

Class.forName() 导致 ClassLoader 将类加载到内存中。 JDBC 驱动程序类具有静态初始化程序,可将它们注册到 DriverManager 以供进一步使用。在您使用Class.forName()DriverManager.getConnection("jdbc:*", database, username, password) 之后,jdbc: 已经加载到内存中。

【讨论】:

    【解决方案2】:

    Class.forName() 用于动态加载类。例如你调用了Class.forName("z"),这将导致类z被初始化并返回相应的对象。

    【讨论】:

      【解决方案3】:

      Class.forName() 使用反射来加载给定名称的类。它返回一个类对象。见this

      在您的情况下,它允许您在运行时加载特定的驱动程序,而无需对驱动程序类型进行硬编码。您只需将驱动程序名称作为参数传递即可。

      【讨论】:

        【解决方案4】:

        它使用reflection来实例化sun.jdbc.odbc.JdbcOdbcDriver类,使用String格式的类名。

        这使您的代码Driver 类独立,并允许您将驱动程序类名称作为字符串参数从外部传递(这是我们通过配置传递连接详细信息时的标准行为)。

        【讨论】:

          猜你喜欢
          • 2013-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-27
          • 2021-11-09
          • 2022-01-26
          相关资源
          最近更新 更多