第 五 章   传递一个查询并处理结果

内容一览

5.1 获得基于指针的结果集
5.2 使用Statement或者PreparedStatement接口
5.3 使用ResultSet接口
5.4 更新操作
5.5 创建并修改数据库对象

    任何时候你想传递一个SQL声明(注:statement)到数据库,你需要一个statement或者PreparedStatement实例。一旦你有了statement或者PreparedStatement,你可以传递一个查询。这个动作将会返回一个包含整个结果的结果集实例,如何改变这个行为请见章节"获得基于指针的结果集"。例5.1说明了这个方法。

例5.1 在JDBC中处理一个简单查询

    这个例子将传递一个简单查询并用Statement打印每行的第一列
 
Statement st = conn.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 = conn.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.1 获得基于指针的结果集

    驱动程序立即默认地集中所有的查询结果,这给大数据集合造成不便,所以JDBC驱动程序提供一种基于数据库游标的ResultSets的方法,只取出少量行。

    少量行隐藏于连接的客户端,用完的时候,会重新定向游标寻找下一块的行。

 
Note
    基于ResultSets的游标不能应用于所有情况。有许多约束将使驱动静静地回退到一次取出全部结果集的做法。
    连接服务器必须使用V3协议。在版本7.4以后中这个是默认的且是唯一支持的。
    连接必须是自动模式的。事务结束时,后端会关掉游标,所以用自动连接模式,后端将在可以从中取得任何数据之前已经关掉游标。
    声明(注:Statement)必须创建一个ResultSet类型的结果集,TYPE_FORWARD_ONLY,这是默认的,所以不需要重写代码来利用这个,但也意味着你将不能回滚或者跳跃访问(注:jump around)结果集。
    特定的查询必须是单一的声明,而不是带有分号的复合声明串。
 

    例 5.2 设置读取的数目以打开或者关掉游标

    改变游标模式的代码和设置适当的读取声明数目一样简单。设置读取数目为0会使所有的行存入缓冲器中(默认操作)。
 
// make sure autocommit is off
conn.setAutoCommit(false);
Statement st = conn.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);
rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
    System.out.print("many rows were returned.");
}
rs.close();
// Close the statement.
st.close();