5.3. 发出查询并处理结果 #
每当你想向数据库发出 SQL 语句时,你都需要一个
Statement 或
PreparedStatement 实例。一旦你有了一个
Statement 或
PreparedStatement,就可以用它发出查询。这将返回一个 ResultSet
实例,其中包含全部结果。例 5.1演示了这个过程。
例 5.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();
5.3.1. 使用 Statement 或 PreparedStatement 接口
使用 Statement 或
PreparedStatement 接口时必须考虑以下几点:
你可以按需多次使用同一个
Statement实例。你可以在打开连接后立刻创建一个,并在该连接的整个生命周期内使用它。但你必须记住,每个Statement或PreparedStatement在同一时刻只能存在一个ResultSet。如果你在处理一个
ResultSet的同时还需要执行另一个查询,只需创建并使用另一个Statement。如果你使用线程,并且有多个线程在使用数据库,你必须为每个线程使用一个单独的
Statement。如果你正在考虑使用线程,请参阅第 5.8 节,其中涵盖了一些要点。用完
Statement或PreparedStatement之后,你应该关闭它。
5.3.2. 使用 ResultSet 接口
使用 ResultSet 接口时必须考虑以下几点:
在读取任何值之前,你必须调用
next()。如果还有结果它就返回 true,但更重要的是,它会让该行准备好被处理。按照 JDBC 规范,你应该只访问一个字段一次。遵守这条规则是最安全的,尽管目前 PostgreSQL 驱动允许你按需多次访问一个字段。
一旦用完一个
ResultSet,你必须通过调用close()来关闭它。一旦你用创建某个
ResultSet的Statement发起另一个查询,当前打开的ResultSet实例会被自动关闭。ResultSet目前是只读的。你无法通过ResultSet更新数据。如果你想更新数据,就需要用老办法,即发出一条 SQL 更新语句。这符合 JDBC 规范 —— 该规范并不要求驱动提供此功能。