⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jdbctm 指南:入门5 - resultset.htm

📁 写给JSP初级程序员的书
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0056)http://eps.www85.cn4e.com/java/article/devshow.asp?id=99 -->
<HTML><HEAD><title>csdn_JDBCTM 指南:入门5 - ResultSet</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<STYLE type=text/css>TD {
	FONT-FAMILY: "Verdana", "Arial", "宋体"; FONT-SIZE: 9pt
}
A {
	COLOR: #660000; TEXT-DECORATION: underline
}
A:hover {
	COLOR: #660000; TEXT-DECORATION: none
}
.line {
	LINE-HEIGHT: 14pt
}
</STYLE>

<META content="MSHTML 5.00.2920.0" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff text=#000000>

  <table><tbody>
  <TR>
    <TD height=21>
      <DIV align=center><B><FONT size=3>JDBCTM 指南:入门5 - ResultSet 
      <BR><FONT size=2> </FONT></FONT></FONT>
      <HR align=center color=#cccccc noShade SIZE=1>
      </DIV></TD></TR>
  <TR>
    <TD class=line><FONT 
      color=#333300>5&nbsp;-&nbsp;ResultSet<BR>本概述是从《JDBCTM&nbsp;Database&nbsp;Access&nbsp;from&nbsp;JavaTM:&nbsp;A&nbsp;Tutorial&nbsp;and&nbsp;Annotated&nbsp;Reference&nbsp;》这本书中摘引来的。JavaSoft&nbsp;目前正在准备这本书。这是一本教程,同时也是&nbsp;JDBC&nbsp;的重要参考手册,它将作为&nbsp;Java&nbsp;系列的组成部份在&nbsp;1997&nbsp;年春季由&nbsp;Addison-Wesley&nbsp;出版公司出版。&nbsp;<BR><BR><BR>5.1&nbsp;概述<BR>ResultSet&nbsp;包含符合&nbsp;SQL&nbsp;语句中条件的所有行,并且它通过一套&nbsp;get&nbsp;方法(这些&nbsp;get&nbsp;方法可以访问当前行中的不同列)提供了对这些行中数据的访问。ResultSet.next&nbsp;方法用于移动到&nbsp;ResultSet&nbsp;中的下一行,使下一行成为当前行。<BR><BR>结果集一般是一个表,其中有查询所返回的列标题及相应的值。例如,如果查询为&nbsp;SELECT&nbsp;a,&nbsp;b,&nbsp;c&nbsp;FROM&nbsp;Table1,则结果集将具有如下形式:&nbsp;<BR><BR><BR>a&nbsp;b&nbsp;c<BR>--------&nbsp;---------&nbsp;--------<BR>12345&nbsp;Cupertino&nbsp;CA<BR>83472&nbsp;Redmond&nbsp;WA<BR>83492&nbsp;Boston&nbsp;MA<BR><BR><BR>下面的代码段是执行&nbsp;SQL&nbsp;语句的示例。该&nbsp;SQL&nbsp;语句将返回行集合,其中列&nbsp;1&nbsp;为&nbsp;int,列&nbsp;2&nbsp;为&nbsp;String,而列&nbsp;3&nbsp;则为字节数组:&nbsp;<BR><BR><BR>java.sql.Statement&nbsp;stmt&nbsp;=&nbsp;conn.createStatement();<BR>ResultSet&nbsp;r&nbsp;=&nbsp;stmt.executeQuery("SELECT&nbsp;a,&nbsp;b,&nbsp;c&nbsp;FROM&nbsp;Table1");<BR>while&nbsp;(r.next())<BR>{<BR>//&nbsp;打印当前行的值。<BR>int&nbsp;i&nbsp;=&nbsp;r.getInt("a");<BR>String&nbsp;s&nbsp;=&nbsp;r.getString("b");<BR>float&nbsp;f&nbsp;=&nbsp;r.getFloat("c");<BR>System.out.println("ROW&nbsp;=&nbsp;"&nbsp;+&nbsp;i&nbsp;+&nbsp;"&nbsp;"&nbsp;+&nbsp;s&nbsp;+&nbsp;"&nbsp;"&nbsp;+&nbsp;f);<BR>}<BR><BR>5.1.1&nbsp;行和光标<BR>ResultSet&nbsp;维护指向其当前数据行的光标。每调用一次&nbsp;next&nbsp;方法,光标向下移动一行。最初它位于第一行之前,因此第一次调用&nbsp;next&nbsp;将把光标置于第一行上,使它成为当前行。随着每次调用&nbsp;next&nbsp;导致光标向下移动一行,按照从上至下的次序获取&nbsp;ResultSet&nbsp;行。<BR><BR>在&nbsp;ResultSet&nbsp;对象或其父辈&nbsp;Statement&nbsp;对象关闭之前,光标一直保持有效。<BR><BR>在&nbsp;SQL&nbsp;中,结果表的光标是有名字的。如果数据库允许定位更新或定位删除,则需要将光标的名字作为参数提供给更新或删除命令。可通过调用方法&nbsp;getCursorName&nbsp;获得光标名。<BR><BR>注意:不是所有的&nbsp;DBMS&nbsp;都支持定位更新和删除。可使用&nbsp;DatabaseMetaData.supportsPositionedDelete&nbsp;和&nbsp;supportsPositionedUpdate&nbsp;方法来检查特定连接是否支持这些操作。当支持这些操作时,DBMS/驱动程序必须确保适当锁定选定行,以使定位更新不会导致更新异常或其它并发问题。<BR><BR><BR>5.1.2&nbsp;列<BR>方法&nbsp;getXXX&nbsp;提供了获取当前行中某列值的途径。在每一行内,可按任何次序获取列值。但为了保证可移植性,应该从左至右获取列值,并且一次性地读取列值。<BR><BR>列名或列号可用于标识要从中获取数据的列。例如,如果&nbsp;ResultSet&nbsp;对象&nbsp;rs&nbsp;的第二列名为“title”,并将值存储为字符串,则下列任一代码将获取存储在该列中的值:&nbsp;<BR><BR>String&nbsp;s&nbsp;=&nbsp;rs.getString("title");<BR>String&nbsp;s&nbsp;=&nbsp;rs.getString(2);<BR><BR>注意列是从左至右编号的,并且从列&nbsp;1&nbsp;开始。同时,用作&nbsp;getXXX&nbsp;方法的输入的列名不区分大小写。<BR><BR>提供使用列名这个选项的目的是为了让在查询中指定列名的用户可使用相同的名字作为&nbsp;getXXX&nbsp;方法的参数。另一方面,如果&nbsp;select&nbsp;语句未指定列名(例如在“select&nbsp;*&nbsp;from&nbsp;table1”中或列是导出的时),则应该使用列号。这些情况下,用户将无法确切知道列名。<BR><BR>有些情况下,SQL&nbsp;查询返回的结果集中可能有多个列具有相同的名字。如果列名用作&nbsp;getXXX&nbsp;方法的参数,则&nbsp;getXXX&nbsp;将返回第一个匹配列名的值。因而,如果多个列具有相同的名字,则需要使用列索引来确保检索了正确的列值。这时,使用列号效率要稍微高一些。<BR><BR>关于&nbsp;ResultSet&nbsp;中列的信息,可通过调用方法&nbsp;ResultSet.getMetaData&nbsp;得到。返回的&nbsp;ResultSetMetaData&nbsp;对象将给出其&nbsp;ResultSet&nbsp;对象各列的编号、类型和属性。<BR><BR>如果列名已知,但不知其索引,则可用方法&nbsp;findColumn&nbsp;得到其列号。<BR><BR><BR>5.1.3&nbsp;数据类型和转换<BR>对于&nbsp;getXXX&nbsp;方法,JDBC&nbsp;驱动程序试图将基本数据转换成指定&nbsp;Java&nbsp;类型,然后返回适合的&nbsp;Java&nbsp;值。例如,如果&nbsp;getXXX&nbsp;方法为&nbsp;getString,而基本数据库中数据类型为&nbsp;VARCHAR,则&nbsp;JDBC&nbsp;驱动程序将把&nbsp;VARCHAR&nbsp;转换成&nbsp;Java&nbsp;String。getString&nbsp;的返回值将为&nbsp;Java&nbsp;String&nbsp;对象。<BR><BR>下表显示了允许用&nbsp;getXXX&nbsp;获取的&nbsp;JDBC&nbsp;类型及推荐用它获取的&nbsp;JDBC&nbsp;类型(通用&nbsp;SQL&nbsp;类型)。小写的&nbsp;x&nbsp;表示允许&nbsp;getXXX&nbsp;方法获取该数据类型;大写的&nbsp;X&nbsp;表示对该数据类型推荐使用&nbsp;getXXX&nbsp;方法。例如,除了&nbsp;getBytes&nbsp;和&nbsp;getBinaryStream&nbsp;之外的任何&nbsp;getXXX&nbsp;方法都可用来获取&nbsp;LONGVARCHAR&nbsp;值,但是推荐根据返回的数据类型使用&nbsp;getAsciiStream&nbsp;或&nbsp;getUnicodeStream&nbsp;方法。方法&nbsp;getObject&nbsp;将任何数据类型返回为&nbsp;Java&nbsp;Object。当基本数据类型是特定于数据库的抽象类型或当通用应用程序需要接受任何数据类型时,它是非常有用的。<BR><BR>可使用&nbsp;ResultSet.getXXX&nbsp;方法获取常见的&nbsp;JDBC&nbsp;数据类型。&nbsp;<BR><BR><BR>5.1.4&nbsp;对非常大的行值使用流<BR>ResultSet&nbsp;可以获取任意大的&nbsp;LONGVARBINARY&nbsp;或&nbsp;LONGVARCHAR&nbsp;数据。方法&nbsp;getBytes&nbsp;和&nbsp;getString&nbsp;将数据返回为大的块(最大为&nbsp;Statement.getMaxFieldSize&nbsp;的返回值)。但是,以较小的固定块获取非常大的数据可能会更方便,而这可通过让&nbsp;ResultSet&nbsp;类返回&nbsp;java.io.Input&nbsp;流来完成。从该流中可分块读取数据。注意:必须立即访问这些流,因为在下一次对&nbsp;ResultSet&nbsp;调用&nbsp;getXXX&nbsp;时它们将自动关闭(这是由于基本实现对大块数据访问有限制)。&nbsp;<BR><BR>JDBC&nbsp;API&nbsp;具有三个获取流的方法,分别具有不同的返回值:&nbsp;<BR><BR><BR>getBinaryStream&nbsp;返回只提供数据库原字节而不进行任何转换的流。<BR><BR><BR>getAsciiStream&nbsp;返回提供单字节&nbsp;ASCII&nbsp;字符的流。<BR><BR><BR>getUnicodeStream&nbsp;返回提供双字节&nbsp;Unicode&nbsp;字符的流。<BR><BR><BR>注意:它不同于&nbsp;Java&nbsp;流,后者返回无类型字节并可(例如)通用于&nbsp;ASCII&nbsp;和&nbsp;Unicode&nbsp;字符。<BR><BR>下列代码演示了&nbsp;getAsciiStream&nbsp;的用法:&nbsp;<BR><BR>java.sql.Statement&nbsp;stmt&nbsp;=&nbsp;con.createStatement();<BR>ResultSet&nbsp;r&nbsp;=&nbsp;stmt.executeQuery("SELECT&nbsp;x&nbsp;FROM&nbsp;Table2");<BR>//&nbsp;现在以&nbsp;4K&nbsp;块大小获取列&nbsp;1&nbsp;结果:<BR>byte&nbsp;buff&nbsp;=&nbsp;new&nbsp;byte[4096];<BR>while&nbsp;(r.next())&nbsp;{<BR>Java.io.InputStream&nbsp;fin&nbsp;=&nbsp;r.getAsciiStream(1);<BR>for&nbsp;(;;)&nbsp;{<BR>int&nbsp;size&nbsp;=&nbsp;fin.read(buff);<BR>if&nbsp;(size&nbsp;==&nbsp;-1)&nbsp;{&nbsp;//&nbsp;到达流末尾<BR>break;<BR>}<BR>//&nbsp;将新填充的缓冲区发送到&nbsp;ASCII&nbsp;输出流:<BR>output.write(buff,&nbsp;0,&nbsp;size);<BR>}<BR>}<BR><BR>5.1.5&nbsp;NULL&nbsp;结果值<BR>要确定给定结果值是否是&nbsp;JDBC&nbsp;NULL,必须先读取该列,然后使用&nbsp;ResultSet.wasNull&nbsp;方法检查该次读取是否返回&nbsp;JDBC&nbsp;NULL。<BR><BR>当使用&nbsp;ResultSet.getXXX&nbsp;方法读取&nbsp;JDBC&nbsp;NULL&nbsp;时,方法&nbsp;wasNull&nbsp;将返回下列值之一:&nbsp;<BR><BR><BR>Java&nbsp;null&nbsp;值:对于返回&nbsp;Java&nbsp;对象的&nbsp;getXXX&nbsp;方法(例如&nbsp;getString、getBigDecimal、getBytes、getDate、getTime、getTimestamp、getAsciiStream、getUnicodeStream、getBinaryStream、getObject&nbsp;等)。<BR><BR><BR>零值:对于&nbsp;getByte、getShort、getInt、getLong、getFloat&nbsp;和&nbsp;getDouble。<BR><BR><BR>false&nbsp;值:对于&nbsp;getBoolean。<BR><BR><BR>5.1.6&nbsp;可选结果集或多结果集<BR>通常使用&nbsp;executeQuery(它返回单个&nbsp;ResultSet)或&nbsp;executeUpdate(它可用于任何数据库修改语句,并返回更新行数)可执行&nbsp;SQL&nbsp;语句。但有些情况下,应用程序在执行语句之前不知道该语句是否返回结果集。此外,有些已存储过程可能返回几个不同的结果集和/或更新计数。<BR><BR>为了适应这些情况,JDBC&nbsp;提供了一种机制,允许应用程序执行语句,然后处理由结果集和更新计数组成的任意集合。这种机制的原理是首先调用一个完全通用的&nbsp;execute&nbsp;方法,然后调用另外三个方法,getResultSet、getUpdateCount&nbsp;和&nbsp;getMoreResults。这些方法允许应用程序一次一个地研究语句结果,并确定给定结果是&nbsp;ResultSet&nbsp;还是更新计数。<BR><BR>用户不必关闭&nbsp;ResultSet;当产生它的&nbsp;Statement&nbsp;关闭、重新执行或用于从多结果序列中获取下一个结果时,该&nbsp;ResultSet&nbsp;将被&nbsp;Statement&nbsp;自动关闭。<BR></FONT></TD></TR>
  <TR>
    <TD height=5>
      <HR align=center color=#cccccc noShade SIZE=1>
    </TD></TR></TBODY></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -