4.3.?发出查询和处理结果

4.3.1. 基于一个游标获取结果
4.3.2. 使用Statement或PreparedStatement接口
4.3.3. 使用ResultSet接口
4.3.4. 执行更新

在数据库运行一个SQL语句的时候, 都需要一个Statement或PreparedStatement实例,就可以发出一个查询,会返回一个ResultSet实例,在其内部包含整个结果。

发出一个简单的查询然后用一个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();

4.3.1.?基于一个游标获取结果

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

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

把代码修改成游标模式,只是设置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();

4.3.2.?使用Statement或PreparedStatement接口

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

  • 可以将一个Statement或 PreparedStatement实例使用劝拿庞蜗菲教ㄗ⒉嵬锯次。可以在打开一个连接后马上创建一个Statement 实例,并且在连接的生存期里使用。必须记住每个Statement或PreparedStatement只能存在一个ResultSet。

  • 如果需要在处理一个ResultSet的时候执行一个查询, 只需要创建并且使用另外一个Statement。

  • 如果使用了线程,并且有几个线程使用数据库, 针对每个线程都必须使用一个独立的Statement。

  • 用完Statement或者PreparedStatement之后,应该关闭它。

4.3.3.?使用ResultSet接口

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

  • 在读取任何数值的时候,必须调用next()。 如果还有结果则返回真(true),但更重要的是,它为处理准备了数据行。

  • 在JDBC规范里,对一个字段应该只访问一次。遵循这个规则是最安全的,不过目前UXDB驱动允许对一个字段访问劝拿庞蜗菲教ㄗ⒉嵬锯次。

  • 一旦结束对一个ResultSet的处理,必须调用对应的close()来关闭它。

  • 一旦使用那个创建ResultSet的Statement做另一个查询请求,当前打开的ResultSet实例将自动关闭。

4.3.4.?执行更新

要改变数据(执行INSERT,UPDATE或者DELETE操作),需要使用executeUpdate()方法。

这个方法类似用于发出SELECT的executeQuery(),但是返回值不是ResultSet,返回的是INSERT,UPDATE或者DELETE语句影响的记录数。

发出一个简单的DELETE并打印出删除的行数,示例如下:

int foovalue = 500;
PreparedStatement st = db.prepareStatement("DELETE FROM mytable WHERE columnfoo = ?");
st.setInt(1, foovalue);
int rowsDeleted = st.executeUpdate();
System.out.println(rowsDeleted + " rows deleted");
st.close();
XML 地图 | Sitemap 地图