为什么 createStatement 方法是在 Connection Interface 而不是 Statement 接口下声明的?

Lea*_*ava 2 java mysql interface

我正在经历一个很大的疑问。今天我在练习数据库连接和从MySQL数据库中的表中读取记录。一切正常。

在编码时我遇到了两个接口,一个是连接,第二个是语句。使用下面的代码片段建立连接后。

Connection Con = DriverManager.getConnection(host, username, password);
Run Code Online (Sandbox Code Playgroud)

我必须创建一个 Statement 对象,该对象将用于执行 SQL 查询。所以我喜欢这个并且能够获得记录。

Statement stmnt = Con.createStatement();
String SQL = "SELECT * FROM sys_config";
ResultSet rs = stmnt.executeQuery( SQL );
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果大多数时候都需要 Statement 对象,那么为什么createStatement()Connection接口中声明。为什么它没有在 Statement 接口下声明?有什么我不知道的具体原因吗?

最后,下面的代码用于获取Statement对由StatementImpl.

public class ConnectionImpl
  extends ConnectionPropertiesImpl
  implements Connection
{...

public Statement createStatement()
    throws SQLException
  {
    return createStatement(1003, 1007);
  }

  public Statement createStatement(int resultSetType, int resultSetConcurrency)
    throws SQLException
  {
    checkClosed();

    StatementImpl stmt = new StatementImpl(this, this.database);
    stmt.setResultSetType(resultSetType);
    stmt.setResultSetConcurrency(resultSetConcurrency);

    return stmt;
  }


}
Run Code Online (Sandbox Code Playgroud)

alb*_*nil 5

createStatement()方法不是静态的。它依赖于Connection数据。如果方法在 Statement 接口中创建为静态,则需要请求 Connection 实例作为输入参数。

不同的Connection实现可能Statements以不同的方式(以及不同的实现)进行实例化。

所以决定成为Connection实例化一个的责任的一部分。

  • @LearnJava 让我用一个更具体的例子来重新表述你的问题。这应该能让你明白。“为什么`ToyotaCar createToyotaCar()` 方法是在类`ToyotaCarFactory` 中而不是在类`ToyotaCar` 中声明的?答案是需要有链条总成、喷漆房等的丰田汽车厂才能制造丰田汽车。丰田汽车不是允许制造丰田汽车的原因。连接/语句也是如此。连接是能够创建语句的对象。它包含允许创建语句的机制。你不会从另一个 stmt 创建一个 stmt (3认同)