任何时候你想传递一个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();
|
|
驱动程序立即默认地集中所有的查询结果,这给大数据集合造成不便,所以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();
|
|