代码之家  ›  专栏  ›  技术社区  ›  Pops Atula

在JDBC中使用resultset时,真正返回的是什么?

  •  1
  • Pops Atula  · 技术社区  · 15 年前

    下面的伪代码可以工作,这对于任何做过任何JDBC工作的人来说都不奇怪:

    ResultSet rs = foo.executeQuery();
    boolean hasNext = rs.next();
    while(hasNext) {
        bar();
        boolean hasNext = rs.next();
    }
    

    结果集(结果集) java.sql.ResultSet )是一个接口,所以不应该有next()的实现,只需要一个方法声明。那么代码是如何成功运行的呢?我在网上找到的最佳答案是,返回的是实现resultset接口的类的实例。

    这个答案对我来说是有意义的(它证实了我在实际调查之前的假设),但它只引出了另一个问题:你怎么知道你会回到什么样的班级?理论上,它难道不是以一种意想不到或不受欢迎的方式重写接口方法的东西吗?

    3 回复  |  直到 14 年前
        1
  •  1
  •   user159088    15 年前

    您得到的是一个实现这些接口的类,可以在数据库驱动程序中找到。

    例如,如果连接到MySQL,则可以使用 here .

    驱动程序实现这些接口。如果您从数据库提供程序获取接口,它不会以意外或不希望的方式实现接口(当然,供应商之间存在实现差异,但它不应该是重要的东西;例如,我今天在使用 DatabaseMetaData.getSQLStateType() . 这应该返回1或2,但我的驱动程序实现决定返回0,但对于其他一切,我没有问题)。

        2
  •  2
  •   kazanaki    15 年前

    在运行时,您的JVM知道返回什么类型的类。你甚至可以用Java自己访问它 运算符 关键字。

    您很可能会得到一些以不希望的方式重写此方法的内容。但是方法的签名总是相同的,并且只有在运行时类转换期间才会出现问题。这就是 遗传 在像Java这样的OOP语言中。

    更多信息 here .

        3
  •  1
  •   J. Dimeo    14 年前

    顺便说一下,这与您的问题无关,但我相信建议使用的结果集应该是这样的:

    ResultSet rs = conn.executeQuery();
    while (rs.next()) {
       bar();
    }
    

    这会导致代码更干净/更短,而不必使用临时布尔变量。

    更相关的一点是,如果您使用“品牌名称”实现者(在本例中是Oracle、MySQL、Microsoft等),则通常可以信任要正确实现的接口,因为文档冗长、用户社区大等原因。就像在杂货店一样,只有在您可以确认内部发生的是SA的情况下,才可以使用通用产品。我是你对品牌的期望。