PreparedStatement.executeQuery如何工作?

时间:2012-07-27 18:59:52

标签: java sql sql-server-2005 jdbc

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

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

谢谢

2 个答案:

答案 0 :(得分:9)

来自文档:

Statement

public ResultSet executeQuery(String sql) throws SQLException
     

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

ResultSet

  

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

public boolean next() throws SQLException
     

将光标从当前位置向下移动一行。一个ResultSet   光标最初位于第一行之前;第一次打电话给   接下来的方法使第一行成为当前行;第二个电话   使第二行成为当前行,依此类推。

     

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


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


但是如何处理数据库的结果实际上取决于实现。为了形成对比,我将引用两个数据库MSSQL,MYSQL。

MSSQL

MSSQL驱动程序的文档,可以准确地评论结果的处理方式,您可以找到here

  

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

     

当结果适合时,使用客户端结果集   客户端进程内存。这些结果提供了最快的性能   并由他们的SQL Server的Microsoft JDBC驱动程序读取   整个数据库。这些结果集不会增加额外的结果   通过产生服务器端的开销来加载数据库   游标。但是,这些类型的结果集不可更新。

     

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

的MySQL

JDBC接口的MySql实现,您可以阅读here

  

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

答案 1 :(得分:2)

你正确地做到了。它从您的查询中获取整个结果,然后循环显示它们 内部指针或游标最初在第一行之前启动,因此调用record.next()会将其移动到第一行。

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