3

如何PreparedStatement.executeQuery运作?它是否从数据库中获取结果并循环遍历它们?或者它获取第一个结果,然后在 record.next 上继续 sql 查询到下一行?

ResultSet record = statement.executeQuery("select * from users");
    while (record.next()) {
    //do something
}

谢谢你

4

2 回答 2

9

从文档中:

陈述

public ResultSet executeQuery(String sql) throws SQLException

执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。

结果集

表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。

public boolean next() throws SQLException

将光标从其当前位置向下移动一行。ResultSet 游标最初位于第一行之前;第一次调用 next 方法使第一行成为当前行;第二次调用使第二行成为当前行,依此类推。

如果当前行的输入流打开,则调用 next 方法将隐式关闭它。读取新行时会清除 ResultSet 对象的警告链。


作为一种表示,这意味着该语句执行一次,并且在迭代时迭代该执行的结果。


但是如何处理来自数据库的结果实际上取决于实现。为了进行对比,我将参考两个数据库 MSSQL、MYSQL。

微软SQL

MSSQL 驱动程序的文档准确地说明了结果的处理方式,您可以在此处找到:

有两种类型的结果集:客户端和服务器端。

当结果可以适合客户端进程内存时,使用客户端结果集。这些结果提供了最快的性能,并由 Microsoft JDBC Driver for SQL Server 从数据库中完整读取。这些结果集不会通过产生创建服务器端游标的开销而对数据库施加额外的负载。但是,这些类型的结果集是不可更新的。

当结果不适合客户端进程内存或结果集可更新时,可以使用服务器端结果集。使用这种类型的结果集,JDBC 驱动程序会创建一个服务器端游标,并在用户滚动浏览结果集时透明地获取结果集的行。

MySQL

您可以在此处阅读的 JDBC 接口的 MySql 实现:

默认情况下,ResultSet 被完全检索并存储在内存中。在大多数情况下这是最有效的操作方式,并且由于 MySQL 网络协议的设计更容易实现。如果您正在使用具有大量行或大值的 ResultSet,并且无法在 JVM 中为所需的内存分配堆空间,您可以告诉驱动程序一次将结果流回一行。

于 2012-07-27T19:06:47.883 回答
2

你做对了。它从您的查询中获取整个结果,然后您遍历它们。
内部指针或游标最初在第一行之前开始,因此调用record.next()会将其移动到第一行。

http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/ResultSet.html#next%28%29

于 2012-07-27T19:03:39.420 回答