1. 概述
ResultSet 提供执行 SQL 语句后从数据库返回结果中获取数据的方法。执行 SQL 语句后
数据库返回结果被 JDBC 处理成结果集对象,可以用 ResultSet 对象的 next 方法以行为单位
进行浏览,用 getXXX 方法取出当前行的某一列的值。
通过 Statement,PreparedStatement,CallableStatement 三种不同类型的语句进行查询都
可以返回 ResultSet 类型的对象。
2. 行和光标
ResultSet 维护指向其当前数据行的逻辑光标。每调用一次 next 方法,光标向下移动一
行。最初它位于第一行之前,因此第一次调用 next 将把光标置于第一行上,使它成为当前
行。随着每次调用 next 导致光标向下移动一行,按照从上至下的次序获取 ResultSet 行。
在 ResultSet 对象或对应的 Statement 对象关闭之前,光标一直保持有效。
3. 列方法 getXXX 提供了获取当前行中某列值的途径。在每一行内,可按任何次序获取列值。
列名或列号可用于标识要从中获取数据的列。例如,如果 ResultSet 对象 rs 的第二列名
为“title”,则下列两种方法都可以获取存储在该列中的值:
String s = rs.getString("title"); String s = rs.getString(2);
注意列是从左至右编号的,并且从 1 开始。
在 DM JDBC 驱动程序中,如果列的全名为“表名.列名”的形式。在不引起混淆的情
况下(结果集中有两个表具有相同的列名),可以省略表名,直接使用列名来获取列值。
关于 ResultSet 中列的信息,可通过调用方法 ResultSet.getMetaData 得到。返回的
ResultSetMetaData 对象将给出其 ResultSet 对象各列的名称、类型和其他属性。
4. NULL 结果值
要确定给定结果值是否是 JDBC NULL,必须先读取该列,然后使用 ResultSet 对象的
wasNull 方法检查该次读取是否返回 JDBC NULL,如下:
String sql="select * from person.person"; ResultSet rs; rs = stmt.executeQuery(sql); while (rs.next()){ if(rs.wasNull()) System.out.println("Get A Null Value"); }
当使用 ResultSet 对象的 getXXX 方法读取 JDBC NULL 时,将返回下列值之一:
1) Java null 值:对于返回 Java 对象的 getXXX 方法(如 getString、getBigDecimal、
getBytes、getDate、getTime、getTimestamp、getAsciiStream、getUnicodeStream、
getBinaryStream、getObject 等);
2) 零值:对于 getByte、getShort、getInt、getLong、getFloat 和 getDouble;
3) false 值:对于 getBoolean。
5. 结果集增强特性
在 DM JDBC 驱动程序中提供了符合 JDBC 2.0 标准的结果集增强特性:可滚动、可更
新结果集,及 JDBC3.0 标准的可持有性。
1) 结果集的可滚动性
通过执行语句而创建的结果集不仅支持向前(从第一行到最后一行)浏览内容,而且还
支持向后(从最后一行到第一行)浏览内容的能力。支持这种能力的结果集被称为可滚动的
结果集。可滚动的结果集同时也支持相对定位和绝对定位。绝对定位指的是通过指定在结果
集中的绝对位置而直接移动到某行的能力,而相对定位则指的是通过指定相对于当前行的位
置来移动到某行的能力。DM 支持可滚动的结果集。
DM JDBC 驱动程序中支持只向前滚结果集(ResultSet.TYPE_FORWARD_ONLY)和滚动
不敏感结果集(ResultSet.TYPE_SCROLL_INSENSITIVE)两种结果集类型,不支持滚动敏感
结果集(ResultSet.TYPE_SCROLL_SENSITIVE)。当结果集为滚动不敏感结果集时,它提供
所含基本数据的静态视图,即结果集中各行的成员顺序、列值通常都是固定的。
2) 结果集的可更新性
DM JDBC 驱 动 程 序 中 提 供 了 两 种 结 果 集 并 发 类 型 : 只 读 结 果 集
(ResultSet.CONCUR_READ_ONLY)和可更新结果集(ResultSet.CONCUR_UPDATABLE)。采
用只读并发类型的结果集不允许对其内容进行更新。可更新的结果集支持结果集的更新操
作。
3) 结果集的可持有性
JDBC 3.0 提供了两种结果集可持有类型:
提 交 关 闭 结 果 集 (ResultSet.CLOSE_CURSORS_AT_COMMIT) 和 跨 结 果 集 提 交
(ResultSet.HOLD_CURSORS_OVER_COMMIT)。采用提交关闭结果集类型的结果集在事务
提交之后被关闭,而跨结果集提交类型的结果集在事务提交之后仍能保持打开状态。
通过 DatabaseMetaData.supportsHoldability()方法可以确定驱动程序是否支持结果集的
可持有性。目前 DM 支持这两种类型。
4) 性能优化
DM JDBC 驱动程序的结果集对象中提供了方法 setFetchDirection 和 setFetchSize 来设置
缺省检索结果集的方向和缺省一次从数据库获取的记录条数。它们的含义与用法和语句对象
中的同名函数是相同的。
6. 更新大对象数据
从 DM JDBC 2.0 驱动程序就支持可更新的结果集,但是对 LOB 对象只能读取,而不能
更新,这也是 JDBC 2.0 标准所规定的。而 JDBC 3.0 规范规定用户可以对 LOB 对象进行更
新,DM JDBC 3.0 驱动程序中实现了这一点:
假设数据库中存在 BOOKLIST 表,且含有 id、comment 两个字段,建表语句如下:
CREATE TABLE BOOKLIST ("ID" INTEGER,"COMMENT" TEXT); INSERT INTO SYSDBA.BOOKLIST VALUES (1, '测试数据'); Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executeQuery("select comment from booklist " + "where id = 1"); rs.next(); Clob commentClob = new Clob(...); rs.updateClob("author", commentClob); // commentClob is a Clob Object rs.updateRow();
7. 自定义方法列表
为了实现对达梦数据库所提供的时间间隔类型和带纳秒的时间类型的支持,在实现
ResultSet 接口的过程中,增加了一些自定义的扩展方法。用户将获得的 ResultSet 对象反溯
成 DmdbResultSet 类型就可以访问这些方法。这些方法所涉及到的扩展类请参看 4.4 节。
表 4.4 自定义方法列表
方法名 |
功能说明 |
getTime(int) |
根据列号(1 开始)获取时间信息,以 java.sql.Time 类型返回。 |
getTime(int, Calendar) |
根据列号(1 开始)、Calendar 对象获取时间信息, 以 java.sql.Time 类型返回。 |
getTime(String) |
根据列名获取时间信息,以 java.sql.Time 类型返回。 |
getTime(String, Calendar) |
根据列名、Calendar 对象获取时间信息, 以 java.sql.Time 类型返回。 |
getTimestamp(int) |
根据列号(1 开始)获取时间信息,以 java.sql.Timestamp 类型返回。 |
getTimestamp(int, Calendar) |
根据列号(1 开始)、Calendar 对象获取时间信息, 以 java.sql.Timestamp 类型返回。 |
getTimestamp(String) |
根据列名获取时间信息,以 java.sql.Timestamp 类型返回。 |
getTimestamp(String, Calendar) |
根据列名、Calendar 对象获取时间信息, 以 java.sql.Timestamp 类型返回。 |
updateINTERVALYM(int, DmdbIntervalYM ) |
设置列为年-月时间间隔类型值 |
updateINTERVALYM(String, DmdbIntervalYM) |
设置列为年-月时间间隔类型值 |
updateINTERVALDT(int, DmdbIntervalDT) |
设置列为日-时时间间隔类型值 |
updateINTERVALDT(String, DmdbIntervalDT) |
设置列为日-时时间间隔类型值 |
另外,DM 中不支持 getURL 和 getRef 方法。
评论