【问题标题】:What is the profit of static method in JDBC? [duplicate]JDBC中的静态方法有什么好处? [复制]
【发布时间】:2016-02-02 08:33:29
【问题描述】:

在 JDBC 中,当你需要获取连接时,你必须先加载一个类 Driver。您可以通过调用 Class.forName 来实现。

Class.forName("org.postgresql.Driver");

该类方法加载一个类并将其添加到DriverManager持有者:

static {
    try {
        DriverManager.registerDriver(new Driver());
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

然后要获得连接,您必须调用静态方法getConnection

Connection connection = DriverManager.getConnection(DbUrl, Username, Password);

getConnection 方法使用单独的线程创建连接等等...

我的问题是为什么 JDK 的作者使用静态方法:Class.forNamegetConnection。 “静态”方法的作用是什么?

【问题讨论】:

  • 我认为Class.forName 的原因是为了验证类可以在类路径中找到——它不会加载任何东西。否则,当您使用特定的 jdbc 连接时,您的程序会失败
  • Class.forName("org.postgresql.Driver"); 不再需要
  • 至于 DriverManager.getConnection 是静态的,为什么不呢?必须先创建 DriverManager 的实例有什么好处?
  • 我的问题一般与静态方法在 JDBC 中的作用有关。为什么我们需要使用它们而不是实例方法。

标签: java


【解决方案1】:

以前您需要使用Class.forName() 显式加载类,因为驱动程序包含将在类加载时运行的初始化代码(新驱动程序不再需要它)。

DriverManager 将注册可用的Drivers,之后您可以使用静态getConnection() 方法使用任何已注册的驱动程序打开连接。选择的驱动程序将取决于使用的 jdbc URL,然后静态工厂方法将返回一个实现 Connection 接口的“本机”连接对象。

如您所见,这些操作中的任何一个都是非静态的并没有任何优势,但是在获得Connection 之后,您就不再使用静态方法了。

所以Class.forName() 是静态的,原因很明显,DriverManager.getConnection() 是静态的,因为它是不同 JDBC 驱动程序 Connection 实现的工厂方法。

【讨论】:

  • 为什么我们不能只使用实例方法?
  • DriverManager 的几乎所有方法都是静态的。
  • 全是工厂方法。完全绕过DriverManager 是可能的,但它会导致依赖于数据库的代码,并且通常是一个坏主意。另一方面,DriverManager 的多个实例也是不必要的。
  • > 会产生依赖于数据库的代码
  • 如果我通过new(没有工厂方法)创建驱动程序并手动调用connect 方法,它将如何导致依赖代码? org.postgresql.Driver
猜你喜欢
  • 2021-04-10
  • 2011-01-27
  • 1970-01-01
  • 2012-06-29
  • 2014-04-11
  • 1970-01-01
  • 2011-07-12
  • 2013-09-25
相关资源
最近更新 更多