PreparedStatement.executeQuery
如何运作?它是从数据库中获取结果还是循环遍历它们?或者它获取第一个结果,并在record.next继续sql查询到下一行?
ResultSet record = statement.executeQuery("select * from users");
while (record.next()) {
//do something
}
谢谢
答案 0 :(得分:9)
来自文档:
public ResultSet executeQuery(String sql) throws SQLException
执行给定的SQL语句,该语句返回单个ResultSet 对象
表示数据库结果集的数据表,通常是 通过执行查询数据库的语句生成。
public boolean next() throws SQLException
将光标从当前位置向下移动一行。一个ResultSet 光标最初位于第一行之前;第一次打电话给 接下来的方法使第一行成为当前行;第二个电话 使第二行成为当前行,依此类推。
如果输入流为当前行打开,则调用 方法接下来将隐式关闭它。 ResultSet对象的警告 读取新行时清除链。
作为表示,这意味着语句执行一次,并且当迭代迭代执行结果时。
但是如何处理数据库的结果实际上取决于实现。为了形成对比,我将引用两个数据库MSSQL,MYSQL。
MSSQL驱动程序的文档,可以准确地评论结果的处理方式,您可以找到here:
结果集有两种类型:客户端和服务器端。
当结果适合时,使用客户端结果集 客户端进程内存。这些结果提供了最快的性能 并由他们的SQL Server的Microsoft JDBC驱动程序读取 整个数据库。这些结果集不会增加额外的结果 通过产生服务器端的开销来加载数据库 游标。但是,这些类型的结果集不可更新。
当结果不适合时,可以使用服务器端结果集 客户端进程内存或结果集可更新时。同 这种结果集,JDBC驱动程序创建服务器端游标 并在用户滚动时透明地获取结果集的行 通过它。
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