ResultSet是一个接口。 Statement.executeQuery(String)如何创建其对象。

时间:2014-05-04 07:57:48

标签: java object interface database-connection resultset

我对ResultSet感到困惑。我们知道ResultSet是一个接口,所以它可以作为参考,但我们不能创建它的对象。所以我的问题是Statement.executeQuery()返回什么对象?

5 个答案:

答案 0 :(得分:2)

它返回一个实现ResultSet的具体对象。 例如,Oracle的Statement接口OracleStatement的实现返回OracleResultSetImpl的实例。

答案 1 :(得分:2)

您可以获取ResultSet

的实际实现类的名称

只需打印

 ResultSet resultSet = ...

 System.out.println(resultSet.getClass().getName());

答案 2 :(得分:1)

嗯,Statement也是一个界面。所以,如果你有一个Statement对象,那么它的类实际上就是其他东西,比如OracleStatementMsSqlServerStatementSybaseStatement或其他什么;取决于您拥有的JDBC驱动程序。 (实际上,我有点编写了这些类名 - 我不知道确切的类名是什么,它确实无关紧要)。

现在,每个executeQuery实施中的Statement版本会略有不同。例如,OracleStatement中的那个将执行一些操作并创建OracleResultSetMsSqlServerStatement中的实现会做一些稍微不同的事情,并创建一个MsSqlServerResultSet。当然,我还在编写班级名称,但你明白了。

您永远不必担心这些类,因为您编写的程序将只使用接口中列出的方法。这正是 的接口。

答案 3 :(得分:0)

ResultSet包含包含一组列的记录。每个记录包含完全相同数量的列,但有些列可能没有值。

当您运行Statement.executeQuery()用于连接数据库的驱动程序时,请为您创建该对象。这样您就可以调用next()getString()getInt()等方法。

要知道哪个是返回的对象,可以调用rs.getClass().getName(),假设rs是ResultSet的变量。但你真的不需要知道这一点。这就是你使用实例的原因,以及Instance的范围。

除非您正在编写驱动程序库,否则您永远不会创建ResultSet对象,也不需要这样做。

答案 4 :(得分:0)

您可能需要更多地了解接口及其用途。一般的想法是,接口是一种在类似的类型对象之间封装类似行为的方法,并且您可以将这些通用方法用于任何实现。

一个简单的案例。

  
      
  1. interface Animal使用speak()方法
  2.   
  3. 两种不同的实施DragonDinosaur
  4.   
public interface Animal {
    void speak();
}
public class Dragon implements Animal {
    @Override
    public void speak() {
        System.out.println("I'm a Dragon!")'
    }
}
public class Dinosaur implements Animal {
    @Override
    public void speak() {
        System.out.println("I'm a Dinosaur!")'
    }
}

在这种情况下,仍然存在案例或继承,Animal是超类型。因此Animal可以用作数据类型。并调用其方法speak()将导致实际调用它的实现指定。例如

Animal animal = new Dragon();
animal.speak();  // prints I am a Dragon

ResultSet的情况也是如此。当你拨打rs.next()时,你没有调用空方法,

public interface ResultSet {
    public boolean next();
}

但实际上已经实现next()接口的某些ResultSet[Impl]的{​​{1}}方法

ResultSet

因此,如果// I'm not sure the exact concrete implementation class, Just making on up public class ResultSetImpl implements ResultSet { @Override public boolean next() { return iStillHaveMore(); } } 返回statement.executeQuery(),则表示您正在使用的ResultSetImpl方法