📄 resultset.doc.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=gb2312">
<title></title>
</head>
<body bgcolor="#ffffff">
<table width="600">
<tr>
<td><font size="-1"><a href="introTOC.doc.html">目录</a> | <a href="statement.doc.html">上一页</a>
| <a href="preparedstatement.doc.html">下一页</a> </font></td>
<td align="right"><i>JDBC<sup><font size="-2">TM</font></sup> 指南:入门</i></td>
</tr>
</table>
<hr>
<p><br>
<a name="1002724"></a> </p>
<h1>5 - ResultSet</h1>
<p>本概述是从《<em>JDBC<font size="-1"><sup>TM</sup></font> Database Access from
Java<font size="-1"><sup>TM</sup></font>: A Tutorial and Annotated Reference </em>》这本书中摘引来的。JavaSoft
目前正在准备这本书。这是一本教程,同时也是 JDBC
的重要参考手册,它将作为 Java 系列的组成部份在 1997 年春季由
Addison-Wesley 出版公司出版。</p>
<p><a name="1003581"></a> </p>
<h2>5.1 概述</h2>
<code>
<p>ResultSet</code> 包含符合 SQL 语句中条件的所有行,并且它通过一套 <code>get</code>
方法(这些 get
方法可以访问当前行中的不同列)提供了对这些行中数据的访问。<code>ResultSet.next</code>
方法用于移动到 <code>ResultSet</code>
中的下一行,使下一行成为当前行。</p>
<p><a name="1002745"></a>结果集一般是一个表,其中有查询所返回的列标题及相应的值。例如,如果查询为
<code>SELECT a, b, c FROM Table1</code>,则结果集将具有如下形式: </p>
<p><a name="1002746"></a> </p>
<pre><a name="1002747"></a> a b c
<a name="1002748"></a> -------- --------- --------
<a
name="1002749"></a> 12345 Cupertino CA
<a name="1002750"></a> 83472 Redmond WA
<a
name="1002751"></a> 83492 Boston MA
</pre>
<p><a name="1002754"></a> </p>
<p><a name="1003584"></a>下面的代码段是执行 SQL 语句的示例。该 SQL
语句将返回行集合,其中列 1 为 <code>int</code>,列 2 为 <code>String</code>,而列
3 则为字节数组: </p>
<pre><a name="1002755"></a>
<a name="1002756"></a> java.sql.Statement stmt = conn.createStatement();
<a
name="1002757"></a> ResultSet r = stmt.executeQuery("SELECT a, b, c FROM Table1");
<a
name="1002758"></a> while (r.next())
<a name="1002759"></a> {
<a name="1002760"></a> // 打印当前行的值。
<a
name="1002761"></a> int i = r.getInt("a");
<a name="1002762"></a> String s = r.getString("b");
<a
name="1002763"></a> float f = r.getFloat("c");
<a name="1002764"></a> System.out.println("ROW = " + i + " " + s + " " + f);
<a
name="1002765"></a> }
</pre>
<a name="1002767"></a>
<h3>5.1.1 行和光标</h3>
<code>
<p>ResultSet</code> 维护指向其当前数据行的光标。每调用一次 <code>next</code>
方法,光标向下移动一行。最初它位于第一行之前,因此第一次调用
<code>next</code>
将把光标置于第一行上,使它成为当前行。随着每次调用 <code>next</code>
导致光标向下移动一行,按照从上至下的次序获取 <code>ResultSet</code>
行。</p>
<p><a name="1002769"></a>在 <code>ResultSet</code> 对象或其父辈 <code>Statement</code>
对象关闭之前,光标一直保持有效。</p>
<p><a name="1002770"></a>在 SQL
中,结果表的光标是有名字的。如果数据库允许定位更新或定位删除,则需要将光标的名字作为参数提供给更新或删除命令。可通过调用方法
<code>getCursorName</code> 获得光标名。</p>
<p><a name="1002771"></a>注意:不是所有的 DBMS
都支持定位更新和删除。可使用 <code>DatabaseMetaData.supportsPositionedDelete</code>
和 <code>supportsPositionedUpdate</code>
方法来检查特定连接是否支持这些操作。当支持这些操作时,DBMS/驱动程序必须确保适当锁定选定行,以使定位更新不会导致更新异常或其它并发问题。</p>
<p><a name="1002772"></a> </p>
<h3>5.1.2 列</h3>
<p>方法 <code>getXXX</code>
提供了获取当前行中某列值的途径。在每一行内,可按任何次序获取列值。但为了保证可移植性,应该从左至右获取列值,并且一次性地读取列值。</p>
<p>列名或列号可用于标识要从中获取数据的列。例如,如果 <code>ResultSet</code>
对象 <code>rs</code> 的第二列名为“title”,并将值存储为字符串,则下列任一代码将获取存储在该列中的值:
</p>
<pre><a name="1002775"></a> String s = rs.getString("title");
<a
name="1002776"></a> String s = rs.getString(2);
</pre>
<p>注意列是从左至右编号的,并且从列 1 开始。同时,用作 <code>getXXX</code>
方法的输入的列名不区分大小写。</p>
<p><a name="1003692"></a>提供使用列名这个选项的目的是为了让在查询中指定列名的用户可使用相同的名字作为
<code>getXXX</code> 方法的参数。另一方面,如果 <code>select</code>
语句未指定列名(例如在“<code>select * from table1</code>”中或列是导出的时),则应该使用列号。这些情况下,用户将无法确切知道列名。</p>
<p><a name="1003695"></a>有些情况下,SQL
查询返回的结果集中可能有多个列具有相同的名字。如果列名用作 <code>getXXX</code>
方法的参数,则 <code>getXXX</code>
将返回第一个匹配列名的值。因而,如果多个列具有相同的名字,则需要使用列索引来确保检索了正确的列值。这时,使用列号效率要稍微高一些。</p>
<p><a name="1002780"></a>关于 <code>ResultSet</code>
中列的信息,可通过调用方法 <code>ResultSet.getMetaData</code>
得到。返回的 <code>ResultSetMetaData</code> 对象将给出其 <code>ResultSet</code>
对象各列的编号、类型和属性。</p>
<p><a name="1002784"></a>如果列名已知,但不知其索引,则可用方法 <code>findColumn</code>
得到其列号。</p>
<p><a name="1002785"></a> </p>
<h3>5.1.3 数据类型和转换</h3>
<p>对于 <code>getXXX</code> 方法,JDBC
驱动程序试图将基本数据转换成指定 Java 类型,然后返回适合的 Java
值。例如,如果 <code>getXXX</code> 方法为 <code>getString</code>,而基本数据库中数据类型为
<code>VARCHAR</code>,则 JDBC 驱动程序将把 <code>VARCHAR</code> 转换成 Java <code>String</code>。<code>getString</code>
的返回值将为 Java <code>String</code> 对象。</p>
<p><a name="1002787"></a>下表显示了<em>允许</em><code>用 getXXX</code> 获取的
JDBC 类型及<em>推荐</em>用它获取的 JDBC 类型(通用 SQL
类型)。小写的 <code>x</code> 表示允许 <code>getXXX</code>
方法获取该数据类型;大写的 <code>X</code>
表示对该数据类型推荐使用 <code>getXXX</code> 方法。例如,除了 <code>getBytes</code>
和 <code>getBinaryStream</code> 之外的任何 <code>getXXX</code>
方法都可用来获取 <code>LONGVARCHAR</code>
值,但是推荐根据返回的数据类型使用 <code>getAsciiStream</code> 或 <code>getUnicodeStream</code>
方法。方法 <code>getObject</code> 将任何数据类型返回为 Java <code>Object</code>。当基本数据类型是特定于数据库的抽象类型或当通用应用程序需要接受任何数据类型时,它是非常有用的。</p>
<p><a name="1003646"></a>可使用 ResultSet.getXXX 方法获取常见的 JDBC
数据类型。</p>
<p><a name="1003647"></a>“x”表示该 <code>getXXX</code>
方法可合法地用于获取给定 JDBC 类型。</p>
<p><a name="1003648"></a>“X”表示<i>推荐</i>使用该 <code>getXXX</code>
方法来获取给定 JDBC 类型。</p>
<table Border="3">
<tr>
<th valign="top"> </th>
<th valign="top"><font size="-1">T<br>
I<br>
N<br>
Y<br>
I<br>
N<br>
T </font></th>
<th valign="top"><font size="-1">S<br>
M<br>
A<br>
L<br>
L<br>
I<br>
N<br>
T </font></th>
<th valign="top"><font size="-1">I<br>
N<br>
T<br>
E<br>
G<br>
E<br>
R </font></th>
<th valign="top"><font size="-1">B<br>
I<br>
G<br>
<br>
N<br>
T </font></th>
<th valign="top"><font size="-1">R<br>
E<br>
A<br>
L </font></th>
<th valign="top"><font size="-1">F<br>
L<br>
O<br>
A<br>
T </font></th>
<th valign="top"><font size="-1">D<br>
O<br>
U<br>
B<br>
L<br>
E </font></th>
<th valign="top"><font size="-1">D<br>
E<br>
C<br>
I<br>
M<br>
A<br>
L </font></th>
<th valign="top"><font size="-1">N<br>
U<br>
M<br>
E<br>
R<br>
I<br>
C </font></th>
<th valign="top"><font size="-1">B<br>
I<br>
T </font></th>
<th valign="top"><font size="-1">C<br>
H<br>
A<br>
R </font></th>
<th valign="top"><font size="-1">V<br>
A<br>
R<br>
C<br>
H<br>
A<br>
R<br>
</font></th>
<th valign="top"><font size="-1">L<br>
O<br>
N<br>
G<br>
V<br>
A<br>
R<br>
C<br>
H<br>
A<br>
R </font></th>
<th valign="top"><font size="-1">B<br>
I<br>
N<br>
A<br>
R<br>
Y </font></th>
<th valign="top"><font size="-1">V<br>
A<br>
R<br>
B<br>
I<br>
N<br>
A<br>
R<br>
Y </font></th>
<th valign="top"><font size="-1">L<br>
O<br>
N<br>
G<br>
V<br>
A<br>
R<br>
B<br>
I<br>
N<br>
A<br>
R<br>
Y </font></th>
<th valign="top"><font size="-1">D<br>
A<br>
T<br>
E </font></th>
<th valign="top"><font size="-1">T<br>
I<br>
M<br>
E </font></th>
<th valign="top"><font size="-1">T<br>
I<br>
M<br>
E<br>
S<br>
T<br>
A<br>
M<br>
P </font></th>
</tr>
<tr>
<td>getByte </td>
<td><strong>X</strong> </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>getShort </td>
<td>x </td>
<td><strong>X</strong> </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>getInt </td>
<td>x </td>
<td>x </td>
<td><strong>X</strong> </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>getLong </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td><strong>X</strong> </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>getFloat </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td><strong>X</strong> </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td>x </td>
<td> </td>
<td> </td>
<td> </td>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -