|
Java 天地
JDBC 指南:入门5 - ResultSet
作者:不详 来源:Java开发者
5 - ResultSet 5.1 概述 结果集一般是一个表,其中有查询所返回的列标题及相应的值。例如,如果查询为 SELECT a, b, c FROM Table1,则结果集将具有如下形式: a b c 下面的代码段是执行 SQL 语句的示例。该 SQL 语句将返回行集合,其中列 1 为 int,列 2 为 String,而列 3 则为字节数组: java.sql.Statement stmt =
conn.createStatement(); 5.1.1 行和光标 在 ResultSet 对象或其父辈 Statement 对象关闭之前,光标一直保持有效。 在 SQL 中,结果表的光标是有名字的。如果数据库允许定位更新或定位删除,则需要将光标的名字作为参数提供给更新或删除命令。可通过调用方法 getCursorName 获得光标名。 注意:不是所有的 DBMS 都支持定位更新和删除。可使用 DatabaseMetaData.supportsPositionedDelete 和 supportsPositionedUpdate 方法来检查特定连接是否支持这些操作。当支持这些操作时,DBMS/驱动程序必须确保适当锁定选定行,以使定位更新不会导致更新异常或其它并发问题。 5.1.2
列 列名或列号可用于标识要从中获取数据的列。例如,如果 ResultSet 对象 rs 的第二列名为“title”,并将值存储为字符串,则下列任一代码将获取存储在该列中的值: String s = rs.getString("title"); 注意列是从左至右编号的,并且从列 1 开始。同时,用作 getXXX 方法的输入的列名不区分大小写。 提供使用列名这个选项的目的是为了让在查询中指定列名的用户可使用相同的名字作为 getXXX 方法的参数。另一方面,如果 select 语句未指定列名(例如在“select * from table1”中或列是导出的时),则应该使用列号。这些情况下,用户将无法确切知道列名。 有些情况下,SQL 查询返回的结果集中可能有多个列具有相同的名字。如果列名用作 getXXX 方法的参数,则 getXXX 将返回第一个匹配列名的值。因而,如果多个列具有相同的名字,则需要使用列索引来确保检索了正确的列值。这时,使用列号效率要稍微高一些。 关于 ResultSet 中列的信息,可通过调用方法 ResultSet.getMetaData 得到。返回的 ResultSetMetaData 对象将给出其 ResultSet 对象各列的编号、类型和属性。 如果列名已知,但不知其索引,则可用方法 findColumn 得到其列号。 5.1.3 数据类型和转换 下表显示了允许用 getXXX 获取的 JDBC 类型及推荐用它获取的 JDBC 类型(通用 SQL 类型)。小写的 x 表示允许 getXXX 方法获取该数据类型;大写的 X 表示对该数据类型推荐使用 getXXX 方法。例如,除了 getBytes 和 getBinaryStream 之外的任何 getXXX 方法都可用来获取 LONGVARCHAR 值,但是推荐根据返回的数据类型使用 getAsciiStream 或 getUnicodeStream 方法。方法 getObject 将任何数据类型返回为 Java Object。当基本数据类型是特定于数据库的抽象类型或当通用应用程序需要接受任何数据类型时,它是非常有用的。 可使用 ResultSet.getXXX 方法获取常见的 JDBC 数据类型。 5.1.4
对非常大的行值使用流 JDBC API 具有三个获取流的方法,分别具有不同的返回值: getBinaryStream 返回只提供数据库原字节而不进行任何转换的流。 getAsciiStream 返回提供单字节 ASCII 字符的流。 getUnicodeStream 返回提供双字节 Unicode 字符的流。 注意:它不同于 Java 流,后者返回无类型字节并可(例如)通用于 ASCII 和 Unicode 字符。 下列代码演示了 getAsciiStream 的用法: java.sql.Statement
stmt = con.createStatement(); 5.1.5 NULL
结果值 当使用 ResultSet.getXXX 方法读取 JDBC NULL 时,方法 wasNull 将返回下列值之一: Java null 值:对于返回 Java 对象的 getXXX 方法(例如 getString、getBigDecimal、getBytes、getDate、getTime、getTimestamp、getAsciiStream、getUnicodeStream、getBinaryStream、getObject 等)。 零值:对于 getByte、getShort、getInt、getLong、getFloat 和 getDouble。 false 值:对于 getBoolean。 5.1.6
可选结果集或多结果集 为了适应这些情况,JDBC 提供了一种机制,允许应用程序执行语句,然后处理由结果集和更新计数组成的任意集合。这种机制的原理是首先调用一个完全通用的 execute 方法,然后调用另外三个方法,getResultSet、getUpdateCount 和 getMoreResults。这些方法允许应用程序一次一个地研究语句结果,并确定给定结果是 ResultSet 还是更新计数。 用户不必关闭 ResultSet;当产生它的 Statement
关闭、重新执行或用于从多结果序列中获取下一个结果时,该 ResultSet 将被 Statement
自动关闭。 |