`

ResultSet 学习

阅读更多
ResultSet 包含符合 SQL 语句中条件的所有行,并且它通过一套 get 方法(这些 get 方法可以访问当前行中的不同列)提供了对这些行中数据的访问。ResultSet.next 方法用于移动到 ResultSet 中的下一行,使下一行成为当前行。

结果集一般是一个表,其中有查询所返回的列标题及相应的值。例如,如果查询为 SELECT a, b, c FROM Table1,则结果集将具有如下形式:

a b c
-------- --------- --------
12345 Cupertino CA
83472 Redmond WA
83492 Boston MA



  下面的代码段是执行 SQL 语句的示例。该 SQL 语句将返回行集合,其中列 1 为 int,列 2 为 String,而列 3 则为字节数组:


java.sql.Statement stmt = conn.createStatement();
ResultSet r = stmt.executeQuery("SELECT a, b, c FROM Table1");
while (r.next())
{
 // 打印当前行的值。
 int i = r.getInt("a");
 String s = r.getString("b");
 float f = r.getFloat("c");
 System.out.println("ROW = " + i + " " + s + " " + f);
} 


  1、行和光标

  ResultSet 维护指向其当前数据行的光标。每调用一次 next 方法,光标向下移动一行。最初它位于第一行之前,因此第一次调用 next 将把光标置于第一行上,使它成为当前行。随着每次调用 next 导致光标向下移动一行,按照从上至下的次序获取ResultSet 行。

  在 ResultSet 对象或其父辈 Statement 对象关闭之前,光标一直保持有效。

  在 SQL 中,结果表的光标是有名字的。如果数据库允许定位更新或定位删除,则需要将光标的名字作为参数提供给更新或删除命令。可通过调用方法getCursorName 获得光标名。

  注意:不是所有的 DBMS 都支持定位更新和删除。可使用 DatabaseMetaData.supportsPositionedDelete 和 supportsPositionedUpdate 方法来检查特定连接是否支持这些操作。当支持这些操作时,DBMS/驱动程序必须确保适当锁定选定行,以使定位更新不会导致更新异常或其它并发问题。
  2、列

  方法 getXXX 提供了获取当前行中某列值的途径。在每一行内,可按任何次序获取列值。但为了保证可移植性,应该从左至右获取列值,并且一次性地读取列值。列名或列号可用于标识要从中获取数据的列。例如,如果 ResultSet 对象 rs 的第二列名为"title",并将值存储为字符串,则下列任一代码将获取存储在该列中的值:

String s = rs.getString("title");
String s = rs.getString(2); 


  注意列是从左至右编号的,并且从列 1 开始。同时,用作 getXXX 方法的输入的列名不区分大小写。

  提供使用列名这个选项的目的是为了让在查询中指定列名的用户可使用相同的名字作为 getXXX 方法的参数。另一方面,如果 select 语句未指定列名(例如在"select * from table1"中或列是导出的时),则应该使用列号。这些情况下,
户将无法确切知道列名。

  有些情况下,SQL 查询返回的结果集中可能有多个列具有相同的名字。如果列名用作 getXXX 方法的参数,则 getXXX 将返回第一个匹配列名的值。因而,如果多个列具有相同的名字,则需要使用列索引来确保检索了正确的列值。这时,使用列号效率要稍微高一些。

  关于 ResultSet 中列的信息,可通过调用方法 ResultSet.getMetaData 得到。返回的 ResultSetMetaData 对象将给出其 ResultSet 对象各列的编号、类型和属性。

  如果列名已知,但不知其索引,则可用方法 findColumn 得到其列号。

  3、数据类型和转换

  对于 getXXX 方法,JDBC 驱动程序试图将基本数据转换成指定 Java 类型,然后返回适合的 Java 值。例如,如果 getXXX 方法为 getString,而基本数据库中数据类型为 VARCHAR,则 JDBC 驱动程序将把 VARCHAR 转换成 Java String。getString 的返回值将为 Java String 对象。

  下表显示了允许用 getXXX 获取的 JDBC 类型及推荐用它获取的 JDBC 类型(通用SQL 类型)。小写的 x 表示允许 getXXX 方法获取该数据类型;大写的 X 表示对该数据类型推荐使用 getXXX 方法。例如,除了 getBytes 和 getBinaryStream 之外的任何 getXXX 方法都可用来获取 LONGVARCHAR 值,但是推荐根据返回的数据类型使用 getAsciiStream 或 getUnicodeStream 方法。方法 getObject 将任何数据类型返回为 Java Object。当基本数据类型是特定于数据库的抽象类型或当通用应用程序需要接受任何数据类型时,它是非常有用的。

  可使用 ResultSet.getXXX 方法获取常见的 JDBC 数据类型。

  "x"表示该 getXXX 方法可合法地用于获取给定 JDBC 类型。

  "X"表示推荐使用该 getXXX 方法来获取给定 JDBC 类型。

  getByte X x x x x x x x x x x x x            
  getShort x X x x x x x x x x x x x            
  getInt x x X x x x x x x x x x x            
  getLong x x x X x x x x x x x x x            
  getFloat x x x x X x x x x x x x x            
  getDouble x x x x x X X x x x x x x            
  getBigDecimal x x x x x x x X X x x x x            
  getBoolean x x x x x x x x x X x x x            
  getString x x x x x x x x x x X X x x x x x x x
  getBytes                           X X x      
  getDate                     x x x       X   x
  getTime                     x x x         X x
  getTimestamp                     x x x       x   X
  getAsciiStream                     x x X x x x      
  getUnicodeStream                     x x X x x x      
  getBinaryStream                           x x X      
  getObject x x x x x x x x x x x x x x x x x x x
  4、对非常大的行值使用流

  ResultSet 可以获取任意大的 LONGVARBINARY 或 LONGVARCHAR 数据。方法getBytes 和 getString 将数据返回为大的块(最大为 Statement.getMaxFieldSize 的返回值)。但是,以较小的固定块获取非常大的数据可能会更方便,而这可通过让 ResultSet 类返回 java.io.Input 流来完成。从该流中可分块读取数据。注意:必须立即访问这些流,因为在下一次对 ResultSet 调用getXXX 时它们将自动关闭(这是由于基本实现对大块数据访问有限制)。

  JDBC API 具有三个获取流的方法,分别具有不同的返回值:

  getBinaryStream 返回只提供数据库原字节而不进行任何转换的流。

  getAsciiStream 返回提供单字节 ASCII 字符的流。

  getUnicodeStream 返回提供双字节 Unicode 字符的流。

  注意:它不同于 Java 流,后者返回无类型字节并可(例如)通用于 ASCII 和Unicode 字符。

  下列代码演示了 getAsciiStream 的用法:


java.sql.Statement stmt = con.createStatement();
ResultSet r = stmt.executeQuery("SELECT x FROM Table2");
// 现在以 4K 块大小获取列 1 结果:
byte buff = new byte[4096];
while (r
// 将新填充的缓冲区发送到 ASCII 输出流:
output.write(buff, 0, size);
}
} 




  5、NULL 结果值

  要确定给定结果值是否是 JDBC NULL,必须先读取该列,然后使用 ResultSet.wasNull 方法检查该次读取是否返回 JDBC 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。

  6、可选结果集或多结果集

  通常使用 executeQuery(它返回单个 ResultSet)或 executeUpdate(它可用于任何数据库修改语句,并返回更新行数)可执行 SQL 语句。但有些情况下,应用程序在执行语句之前不知道该语句是否返回结果集。此外,有些已存储过程可能返回几个不同的结果集和/或更新计数。

  为了适应这些情况,JDBC 提供了一种机制,允许应用程序执行语句,然后处理由结果集和更新计数组成的任意集合。这种机制的原理是首先调用一个完全通用的execute 方法,然后调用另外三个方法,getResultSet、getUpdateCount 和getMoreResults。这些方法允许应用程序一次一个地研究语句结果,并确定给定结果是 ResultSet 还是更新计数。

  为了适应这些情况,JDBC 提供了一种机制,允许应用程序执行语句,然后处理由结果集和更新计数组成的任意集合。这种机制的原理是首先调用一个完全通用的execute 方法,然后调用另外三个方法,getResultSet、getUpdateCount 和getMoreResults。这些方法允许应用程序一次一个地研究语句结果,并确定给定结果是 ResultSet 还是更新计数。

  用户不必关闭 ResultSet;当产生它的 Statement 关闭、重新执行或用于从多结果序列中获取下一个结果时,该 ResultSet 将被 Statement 自动关闭。

在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移动,包括:
ResultSet.first():将数据指针移到结果集的第一行
ResultSet.last(): 将数据指针移到结果集的最后一行
ResultSet.previous(): 将数据指针上移一行
分享到:
评论

相关推荐

    ResultSet对象获取数据的各种方法

    通过对`ResultSet`对象的学习,我们可以更高效地管理和操作从数据库中获取的数据。无论是简单的数据检索还是复杂的事务处理,熟练掌握这些方法都是非常重要的。此外,正确使用这些API可以显著提高应用程序的性能和...

    poi根据ResultSet到处Excle源码

    标题中的“poi根据ResultSet到处Excle源码”指的是使用Java的Apache POI库将数据库...用户可以学习这个项目的源码,理解如何将数据库数据与Excel文件进行交互,这对于数据库管理和数据处理的技能提升有着积极的意义。

    JdbcSql.rar_java resultset_jtable

    对于主题内容的学习,这个文件可能不是必需的。 综上所述,`JdbcSql.rar`文件示例涵盖了Java数据库连接、SQL查询处理、Swing GUI组件使用以及数据展示的方法。通过理解和掌握这些知识点,开发者可以构建出能够从...

    jdbc学习文档

    ### JDBC学习文档精要 #### 一、JDBC概述与应用场景 **1.1 JDBC概念** JDBC(Java Database Connectivity)是一种用于执行SQL语句的标准Java API,它为Java开发者提供了一种统一的方式去访问各种关系型数据库。...

    jsp在线学习系统.zip

    这包括使用PreparedStatement预编译SQL语句,以提高安全性并防止SQL注入攻击,同时使用ResultSet来获取查询结果。 【在线学习系统功能】 1. 用户模块:用户可以注册新账户,通过邮箱或手机号验证激活账户。登录系统...

    java学习文档5(word)

    "java学习文档5(word)"很可能是关于Java编程的学习资料,涵盖了基础到进阶的知识点,帮助初学者或开发者深入理解Java语言的核心概念和实践技巧。 在Java学习的过程中,JDBC(Java Database Connectivity)是一个...

    sql 学习 mysql 数据库学习

    在SQL学习中,MySQL是一个非常重要的关系型数据库管理系统,它被广泛应用于各种规模的企业和项目中,也是初学者入门数据库管理的理想选择。本教程将带你深入理解SQL的基础知识,并通过实际操作MySQL数据库来掌握这些...

    java.sql.ResultSet DOM Wrapper-开源

    java.sql.ResultSet的Java DOM包装器; 允许在表示结果集的瘦DOM文档上使用XPath / XSLT。 文档不包含实际的结果集数据,仅包含对行和列索引的引用。

    Java程序设计教学做一体化教程JDBC数据库操作PPT教案学习.pptx

    Java程序设计教学做一体化教程JDBC数据库操作是一个重要的学习领域,尤其对于计算机科学和技术专业的学生而言。JDBC,全称为Java Database Connectivity,是Java语言中用于与各种数据库进行交互的一套标准API。它...

    JDBC学习笔记(笔记+包含详细注释的代码)

    **JDBC学习笔记** Java Database Connectivity (JDBC) 是Java平台中用于与各种数据库进行交互的一组接口和类。它是Java SE的一部分,允许Java应用程序连接到数据库,执行SQL语句,处理结果集,并进行事务管理。这篇...

    JDBC学习文档

    ### JDBC学习文档知识点详解 #### 一、JDBC概述与基本概念 JDBC(Java Database Connectivity)是Java中用于操作数据库的一种标准API,它提供了一系列的接口和类,允许Java程序连接并操作各种类型的数据库系统。...

    Java 学习笔记Java学习笔记

    它提供DriverManager、Connection、Statement、PreparedStatement和ResultSet等接口和类。 9. Swing GUI:Swing是Java的图形用户界面库,提供丰富的组件如JButton、JLabel、JFrame等,用于构建桌面应用程序。MVC...

    配套学习资料:Java开发 - 尚硅谷JDBC学习笔记

    Java开发 - 尚硅谷JDBC学习笔记是一套深入解析Java数据库连接(JDBC)技术的教程,涵盖了从基础到进阶的各种知识点。JDBC是Java编程语言中用于访问数据库的标准应用编程接口,它允许程序员使用Java来执行SQL语句,...

    详细标准的jdbc学习资料

    通过本套学习资料,你可以系统地了解和掌握JDBC的使用,包括建立连接、执行SQL、处理结果、事务处理、批处理和优化技巧等,为实际的数据库操作打下坚实的基础。资料分为四个部分,分别从初级到高级逐步深入,从day1...

    学习资料整理合集完整版

    通过DriverManager类加载数据库驱动,然后使用Connection对象建立与数据库的连接,Statement或PreparedStatement对象用于执行SQL语句,ResultSet对象用于存储查询结果。 【Swing和JavaFX图形用户界面】 Java提供了...

    JAVA的JDBC学习遇到的问题1

    这篇博客"JAVA的JDBC学习遇到的问题1"可能是作者在深入学习JDBC时遇到的一些常见挑战和解决方法的记录。虽然没有具体的描述内容,我们可以根据一般的学习路径来探讨JDBC相关的知识点。 1. **JDBC基本概念**:首先,...

    JAVA中使用数据库PPT教案学习.pptx

    JAVA 中使用数据库 PPT 教案学习 JAVA 中使用数据库是指在 JAVA 应用程序中使用数据库来存储和管理数据。在这个 PPT 教案中,我们将学习如何使用 JAVA 语言连接数据库、执行 SQL 语句、处理查询结果等。 数据库...

    java学习详细笔记

    ### Java学习详细笔记 #### 1. 什么是JDBC? JDBC(Java Database Connectivity)是Java平台中的数据库连接技术,它允许Java程序连接各种类型的数据库并执行SQL命令。JDBC由一组接口和类组成,这些接口和类为开发...

    java 学习资料|最适合初学者的资料,与你分享

    - **SQL查询**:执行CRUD操作,了解PreparedStatement和ResultSet。 11. **设计模式**: - **常见设计模式**:学习单例、工厂、观察者、装饰器等设计模式,提升代码可维护性和可扩展性。 这些知识点构成了Java...

    jsp二期学习笔记(北大青鸟二期学习)

    ### JSP 二期学习笔记(北大青鸟二期学习) #### JSP 二期学习概述 本学习笔记主要记录了在北大青鸟进行的JSP二期培训过程中所学到的关键知识点和技术细节。JSP(JavaServer Pages)是一种基于Java的技术,用于...

Global site tag (gtag.js) - Google Analytics