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

在JDBC中使用ResultSet时,真正会得到什么?

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

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

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

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

    这个答案对我来说是有道理的(它证实了我在实际查找之前的假设),但它只会引出另一个问题:你怎么知道你要上什么样的课?理论上,它不能以一种意想不到或不受欢迎的方式覆盖接口的方法吗?

    3 回复  |  直到 16 年前
        1
  •  1
  •   user159088    16 年前

    在运行时,JVM知道返回什么样的类。您甚至可以使用java自己访问它 实例检查 关键字。

    你完全有可能得到以不受欢迎的方式覆盖此方法的东西。但是方法的签名总是相同的,只有在运行时才会出现类强制转换问题。这就是 继承 在像Java这样的面向对象编程语言中。

    更多信息 here .

        2
  •  2
  •   kazanaki    16 年前

    例如,如果你连接到MySQL,你可能会使用以下驱动程序 here .

    驱动程序实现了这些接口。如果你从数据库提供者那里获得接口,它不会以意外或不理想的方式实现它们(当然,供应商之间存在实现差异,但这不应该是什么大问题;例如,我今天在使用 DatabaseMetaData.getSQLStateType() 。这应该返回1或2,但我的驱动程序实现决定返回0,但其他一切我都没有问题)。

        3
  •  1
  •   J. Dimeo    15 年前

    顺便说一句,这与你的问题无关,但我认为结果集的推荐用法应该是这样的:

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

    这使得代码更简洁/更短,而不必使用临时布尔变量。