我对ResultSet感到困惑。我们知道ResultSet是一个接口,所以它可以作为参考,但我们不能创建它的对象。所以我的问题是Statement.executeQuery()返回什么对象?
答案 0 :(得分:2)
它返回一个实现ResultSet
的具体对象。
例如,Oracle的Statement
接口OracleStatement
的实现返回OracleResultSetImpl
的实例。
答案 1 :(得分:2)
您可以获取ResultSet
只需打印
ResultSet resultSet = ...
System.out.println(resultSet.getClass().getName());
答案 2 :(得分:1)
嗯,Statement
也是一个界面。所以,如果你有一个Statement
对象,那么它的类实际上就是其他东西,比如OracleStatement
,MsSqlServerStatement
或SybaseStatement
或其他什么;取决于您拥有的JDBC驱动程序。 (实际上,我有点编写了这些类名 - 我不知道确切的类名是什么,它确实无关紧要)。
现在,每个executeQuery
实施中的Statement
版本会略有不同。例如,OracleStatement
中的那个将执行一些操作并创建OracleResultSet
。 MsSqlServerStatement
中的实现会做一些稍微不同的事情,并创建一个MsSqlServerResultSet
。当然,我还在编写班级名称,但你明白了。
您永远不必担心这些类,因为您编写的程序将只使用接口中列出的方法。这正是 的接口。
答案 3 :(得分:0)
ResultSet包含包含一组列的记录。每个记录包含完全相同数量的列,但有些列可能没有值。
当您运行Statement.executeQuery()
用于连接数据库的驱动程序时,请为您创建该对象。这样您就可以调用next()
,getString()
,getInt()
等方法。
要知道哪个是返回的对象,可以调用rs.getClass().getName()
,假设rs
是ResultSet的变量。但你真的不需要知道这一点。这就是你使用实例的原因,以及Instance
的范围。
除非您正在编写驱动程序库,否则您永远不会创建ResultSet
对象,也不需要这样做。
答案 4 :(得分:0)
您可能需要更多地了解接口及其用途。一般的想法是,接口是一种在类似的类型对象之间封装类似行为的方法,并且您可以将这些通用方法用于任何实现。
一个简单的案例。
interface Animal
使用speak()
方法- 两种不同的实施
醇>Dragon
和Dinosaur
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
方法