`
小鑫的java
  • 浏览: 142943 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

JDBC_ResultSet对象介绍

阅读更多
http://hi.baidu.com/ichooseilike/blog/item/66c434234569fe48925807b0.html
JDBC之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",并将值存储为字符串,则下列任一代码将获取存储在该列中的值:

*******2种写法都可以
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 自动关闭。
感谢网友:moonsoft
另加:
在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移

动,包括:
ResultSet.first():将数据指针移到结果集的第一行
ResultSet.last(): 将数据指针移到结果集的最后一行
ResultSet.previous(): 将数据指针上移一行

源文出处:http://www.cnblogs.com/suibing/articles/214591.html

 

分享到:
评论

相关推荐

    JDBC基础教程之ResultSet对象.doc )

    JDBC基础教程之ResultSet对象.doc )

    如何从 Java 存储过程将 JDBC ResultSet 作为 Ref Cursor 返回.doc

    本文档演示如何从 Java 存储过程将 JDBC ResultSet 作为 REF CURSOR 返回。...Java 存储过程 getDepartments(ResultSet[] rout) 将 ResultSet 对象作为 OUT 参数并将 DEPT 表的所有列装入此 ResultSet 对象中。

    JdbcSql.rar_java resultset_jtable

    在JTable中动态显示ResultSet对象 需要设置好数据源~

    Java-JDBC【之】数据类型、封装JDBCUtil、封装通用增删改、ResultSet与ResultSetMetaData

    Java-JDBC【之】数据类型、封装JDBCUtil、封装通用增删改、ResultSet与ResultSetMetaData、查询结果集映射Map与ListMap 1.数据类型 2.封装通用增删改 2.1.封装JDBCUtil 2.2.封装Dao通用增删改 2.3.测试 3.ResultSet...

    Java数据库接口JDBC介绍

    目录 前言 1 参考资料 1 第1章 JDBC概述 2 1.1 JDBC用途 2 第2章 主要调用对象接口介绍 2 2.1 connection对象 2 ...2.4 ResultSet对象 9 2.4.1 行和光标 9 2.4.2 列 10 第3章 常用数据库JDBC写法 10

    jdbcObjectMapper:JDBC ResultSet对象映射器

    用户,公司)中选择的,并且这些列在一个查询结果中:id,payment_date,payment_amount,user_id,user_name,user_surname,company_id,company_name 并且我们需要将这些列映射到Payment对象。 默认情况下,我们...

    JDBC连接所有数据库步骤

    JDBC连接所有数据库步骤 1 将数据库的JDBC驱动加载到classpath中,在基于JAVAEE的WEB...6 访问结果记录集ResultSet对象。 7 依次将ResultSet、Statement、PreparedStatement、Connection对象关闭,释放所占用的资源。

    JDBC笔记 JDBC笔记

    一、概述: JDBC从物理结构上说就是Java语言访问数据库的一套接口集合。从本质上来说就是调用者(程序员)和实现者(数据库...java.sql.ResultSetMetaData 可用于获取关于ResultSet对象中列的类型和属性信息的对象。

    taos-jdbcdriver-2.0.4.jar

    TDengine 的 JDBC 驱动实现尽可能的与关系型数据库驱动保持一致,但时序空间数据库与关系对象型数据库服务的对象和技术特征的差异导致 taos-jdbcdriver 并未完全实现 JDBC 标准规范。在使用时需要注意以下几点: ...

    Java_JDBC由浅入深

    第五节 ResultSet接口的使用详解 20 第六节 JDBC 中数据类型详解 30 6.1 基本数据类型 30 6.2 日期类型 34 6.3 CLOB类型 36 6.4 BLOB类型 39 6.5 其他数据类型 41 第七节 DAO设计模式详解 41 7.1 实际项目中如何使用...

    使用JDBC从数据库中查询数据的方法

    * ResultSet 结果集:封装了使用JDBC 进行查询的结果 * 1. 调用Statement 对象的 executeQuery(sql) 方法可以得到结果集 * 2. ResultSet 返回的实际上就是一张数据表,有一个指针指向数据表的第一行的前面, * ...

    使用JDBC总结操作数据库

    1. 加载驱动Class.forName("oracle.jdbc.driver.OracleDriver");//相当于我们的第三方工具pl/...命令对象执行语句ResultSet rs = st.executeQuery(sql);//注意 select 返回的是一个结果集 6. 关闭连接对象con.close();

    尚硅谷_佟刚_JDBC.pptx

    4. 以面向对象的思想编写 JDBC 应用程序(视频5-6) 5. 使用 PreparedStatement(视频7) 6. 利用反射及 JDBC 元数据编写通用的查询方法(视频8-9) 7. DAO 设计模式(视频10-12) 8. JDBC 元数据(视频13) 9. 获取插入记录...

    使用注释将JDBC结果集映射到对象

    一个简单的代码,以通用方式使用注释将JDBC ResultSet映射到对象

    Java-JDBC【源码】JDBC概述、获取连接、SQL注入问题与解决、查询解析

    6.解析查询对象`ResultSet` 7.关闭连接 `ResultSet 、Statement 、Connection` 3.SQL注入问题与解决(Statement 、PreparedStatement) 3.1.模拟SQL注入 3.2.PreparedStatement解决 3.3.Statement 与 ...

    JSP通过JDBC访问数据库

    是一个最简单,也是学习jsp必须会的一个入门实验----通过jdbc连接数据库。 采用jsp+access数据库实现,同时使用javabean通过jdbc连接数据库。运行结果将显示从数据库查询出的图书。里面包含了javabean的源代码及解释...

    day01_jdbc基础.md

    JDBC的定义,JDBCUtils,JDBC HelloWorld,什么情况会触发类加载,DriverManager,Connetion,Statement,ResultSet,三层结构,对象创建过程,配置Tomcat步骤

    删掉,复制别人东西,怕侵权,原本只想收藏的

    一:工作量比较大,需要连接,然后处理jdbc底层事务,处理数据类型,还需要操作Connection,Statement对象和ResultSet对象去拿数据并关闭他们。 二:我们对jdbc编程可能产生的异常进行捕捉处理并正确关闭资源 ...

    JAVA的JDBC详解,面试必问

    * executeQuery():只能执行查询语句(DQL),返回ResultSet对象,即结果集对象。 * executeUpdate():执行DML语句(增删改语句)和DDL语句(数据定义语言,Create、Alter、Drop),返回受影响记录数或者零。 * ...

    JDBC元数据操作--DatabaseMetaData接口Demo

    在JDBC技术规范中,提供了Connection,Statement,ResultSet这三个开发过程中经常用到的接口。针对与每个接口,JDBC规范提供了相应的接口描述对象,也就是xxxMetaData系列描述对象。DatabaseMetaData和...

Global site tag (gtag.js) - Google Analytics