繁体   English   中英

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

[英]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对象,则它的类实际上是其他类,例如OracleStatementMsSqlServerStatementSybaseStatement或其他; 取决于您拥有的JDBC驱动程序。 (实际上,我是由那些类名组成的-我不知道确切的类名是什么,这真的没有关系)。

现在,每个Statement实现中的executeQuery版本将稍有不同。 例如, OracleStatement那个将做一些事情并创建一个OracleResultSet MsSqlServerStatement的实现将做一些稍有不同的工作,并创建一个MsSqlServerResultSet 当然,我仍在补全类名,但是您明白了。

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

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

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

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

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

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

一个简单的案例。

  1. speak()方法interface Animal
  2. 两种不同的实现DragonDinosaur
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM