pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
每当你想向数据库发出 SQL 语句时,你都需要一个 Statement 或 PreparedStatement 实例。一旦你有了一个 Statement 或 PreparedStatement,就可以用它发出 查询。这将返回一个 ResultSet 实例,其中包含全部结果(如何改变这一行为参见 第 31.3.1 节)。 例 31.1 演示了这个过程。
例 31.1. 在 JDBC 中处理一个简单查询
这个例子将使用 Statement 发出一个简单的查询, 并打印出每一行的第一列。
Statement st = db.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");
while (rs.next()) {
System.out.print("Column 1 returned ");
System.out.println(rs.getString(1));
}
rs.close();
st.close();
这个例子发出与之前相同的查询,但使用 PreparedStatement 和查询中的一个绑定值。
int foovalue = 500;
PreparedStatement st = db.prepareStatement("SELECT * FROM mytable WHERE columnfoo = ?");
st.setInt(1, foovalue);
ResultSet rs = st.executeQuery();
while (rs.next()) {
System.out.print("Column 1 returned ");
System.out.println(rs.getString(1));
}
rs.close();
st.close();
默认情况下,驱动会一次性收集该 查询的所有结果。这对大型数据集来说可能不方便,因此 JDBC 驱动提供了一种把 ResultSet 建立在数据库游标上、 并且每次只取少量行的手段。
少量行会被缓存在连接的 客户端一侧,当缓存用尽时,通过重新定位游标 取回下一批行。
例 31.2. 设置提取数量来打开和关闭游标。
把代码改成游标模式非常简单,只需把 Statement 的提取数量(fetch size)设置为 适当的大小即可。把提取数量设回 0 将导致 缓存所有行(默认行为)。
Statement st = db.createStatement();
// Turn use of the cursor on.
st.setFetchSize(50);
ResultSet rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
System.out.print("a row was returned.");
}
rs.close();
// Turn the cursor off.
st.setFetchSize(0);
ResultSet rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
System.out.print("many rows were returned.");
}
rs.close();
// Close the statement.
st.close();
Statement 或 PreparedStatement 接口使用 Statement 或 PreparedStatement 接口时必须考虑 以下几点:
你可以按需多次使用同一个 Statement 实例。 你可以在打开连接后立刻创建一个,并在该连接的 整个生命周期内使用它。但你必须记住,每个 Statement 或 PreparedStatement 在同一时刻只能存在一个 ResultSet。
如果你在处理一个 ResultSet 的同时还需要执行另一个查询, 只需创建并使用另一个 Statement。
如果你使用线程,并且有多个线程在使用数据库, 你必须为每个线程使用一个单独的 Statement。 如果你正在考虑使用线程,请参阅 第 31.9 节, 其中涵盖了一些要点。
用完 Statement 或 PreparedStatement 之后, 你应该关闭它。
ResultSet 接口使用 ResultSet 接口时必须考虑 以下几点:
在读取任何值之前,你必须调用 next()。如果还有 结果它就返回 true,但更重要的是,它会让该行准备好被 处理。
按照 JDBC 规范,你应该 只访问一个字段一次。遵守这条规则是最安全的, 尽管目前 PostgreSQL 驱动允许你 按需多次访问一个字段。
一旦用完一个 ResultSet,你必须通过调用 close() 来关闭它。
一旦你用创建某个 ResultSet 的 Statement 发起另一个查询,当前打开的 ResultSet 实例会被自动 关闭。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。