31.3. 发出查询和处理结果

在任何你想向数据库运行一个SQL语句的时候, 你都需要一个StatementPreparedStatement 实例。 一旦你拥有了一个StatementPreparedStatement,你就可以发出一个查询。 这样将返回一个ResultSet 实例, 在其内部包含整个结果。Example 31-1 演示了这个过程。

Example 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();

31.3.1. 基于一个游标获取结果

缺省时,驱动程序一次从查询里获取所有的结果。这样可能对于大的数据集来说是不方便的, 因此 JDBC 驱动提供了一个方法从一个数据库游标伤抽取少数几行的 ResultSet 的方法。

在链接的客户端这边缓冲了一小部分数据行,并且在用尽之后, 则通过重定位游标检索下一个数据行块。

Example 31-2. 设置抓取的大小以开关游标

把代码修改成游标模式简单到只是设置 Statement 的抓取大小到一个合适的程度。 把抓取大小设置为 0 则是缓冲所有行的模式(缺省行为)。

Statement st = db.createStatement();
// 打开游标的使用。
st.setFetchSize(50);
ResultSet rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
   System.out.print("a row was returned.");
}
rs.close();
// 关闭游标的使用。
st.setFetchSize(0);
ResultSet rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
   System.out.print("many rows were returned.");
}
rs.close();
// 关闭语句
st.close();

31.3.2. 使用 StatementPreparedStatement 接口

在使用StatementPreparedStatement接口时必须考虑下面的问题:

31.3.3. 使用ResultSet(结果集)接口

使用ResultSet接口时必须考虑下面的问题: