[英]ResultSet is a interface. How does Statement.executeQuery(String) create its object.?
我对ResultSet感到困惑。 我们知道ResultSet是一个接口,因此可以将其用作引用,但不能创建其对象。 所以我的问题是Statement.executeQuery()返回哪个对象?
它返回一个实现ResultSet
的具体对象。 例如,Oracle对Statement
接口的实现OracleStatement
返回OracleResultSetImpl
的实例。
您可以获取ResultSet
的实际实现类的名称
只需打印
ResultSet resultSet = ...
System.out.println(resultSet.getClass().getName());
好吧, Statement
也是一个接口。 因此,如果您有一个Statement
对象,则它的类实际上是其他类,例如OracleStatement
或MsSqlServerStatement
或SybaseStatement
或其他; 取决于您拥有的JDBC驱动程序。 (实际上,我是由那些类名组成的-我不知道确切的类名是什么,这真的没有关系)。
现在,每个Statement
实现中的executeQuery
版本将稍有不同。 例如, OracleStatement
那个将做一些事情并创建一个OracleResultSet
。 MsSqlServerStatement
的实现将做一些稍有不同的工作,并创建一个MsSqlServerResultSet
。 当然,我仍在补全类名,但是您明白了。
您不必担心这些类,因为您编写的程序将只使用接口中列出的方法。 这正是接口的作用 。
ResultSet包含包含一组列的记录。 每个记录包含的列数完全相同,尽管某些列可能没有值。
当您运行用于连接数据库的驱动程序Statement.executeQuery()
,请为您创建该对象。 这样您就可以调用其方法,例如next()
, getString()
, getInt()
等。
要知道返回的对象,可以调用rs.getClass().getName()
,假设rs
是ResultSet的变量。 但是您真的不需要知道这一点。 这就是为什么要使用实例以及Instance
范围的原因。
除非您正在编写驱动程序库,否则您将永远不会创建ResultSet
对象,也无需这样做。
您可能需要对接口及其用途有更多的了解。 通常的想法是,接口是一种封装相似类型对象之间相似行为的方式,并且您可以在任何实现中使用这些通用方法。
一个简单的案例。
- 用
speak()
方法interface Animal
- 两种不同的实现
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();
}
但实际上是某些ResultSet[Impl]
的next()
方法已实现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
,那么这就是您要使用的next()
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.