在数据库运行一个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();
缺省时,驱动程序一次从查询里获取所有的结果。这样可能对于大的数据集来说是不方便的,因此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();
在使用Statement或PreparedStatement接口时必须考虑下面的问题:
可以将一个Statement或 PreparedStatement实例使用劝拿庞蜗菲教ㄗ⒉嵬锯次。可以在打开一个连接后马上创建一个Statement 实例,并且在连接的生存期里使用。必须记住每个Statement或PreparedStatement只能存在一个ResultSet。
如果需要在处理一个ResultSet的时候执行一个查询, 只需要创建并且使用另外一个Statement。
如果使用了线程,并且有几个线程使用数据库, 针对每个线程都必须使用一个独立的Statement。
用完Statement或者PreparedStatement之后,应该关闭它。
使用ResultSet接口时必须考虑下面的问题:
在读取任何数值的时候,必须调用next()。 如果还有结果则返回真(true),但更重要的是,它为处理准备了数据行。
在JDBC规范里,对一个字段应该只访问一次。遵循这个规则是最安全的,不过目前UXDB驱动允许对一个字段访问劝拿庞蜗菲教ㄗ⒉嵬锯次。
一旦结束对一个ResultSet的处理,必须调用对应的close()来关闭它。
一旦使用那个创建ResultSet的Statement做另一个查询请求,当前打开的ResultSet实例将自动关闭。
要改变数据(执行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();