ResultSet:

1,定义

        public interface ResultSet

     表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。

2,获得

        Statement stmt = con.createStatement(
                                      ResultSet.TYPE_SCROLL_INSENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE);
       ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");

3,迭代

     ResultSet 对象具有指向其当前数据行的指针。最初,指针被置于第一行之前。next 方法将指针移动到下一行;因为该方法在 ResultSet 对象中没有下一行时返回                 false,所以可以在 while 循环中使用它来迭代结果集。

      while(rs.next())

      {

       }

   4,取值

    ResultSet 接口提供用于从当前行检索列值的获取方法(getBooleangetLong 等)。可以使用列的索引编号或列的名称检索值。一般情况下,使用列索引较为高效。  列从 1 开始编号。为了获得最大的可移植性,应该按从左到右的顺序读取每行中的结果集列,而且每列只能读取一次。

    rs.getString();

    以上部分摘自JDK1.5的中文版文档,如果由于版本问题导致了一些问题,请见谅。在此并没有详尽的列出所有关于ResultSet的信息,大家可自行翻阅文档。但是我们在程序中基本上就只使用以上列出的部分了,我猜在大部分情况下,我们在WEB应用中,很少使用ResultSet进行数据更新吧?所以我并没有列出关于数据更新的相关内容,感兴趣的可自行查看。

    下面想象一个问题:我从数据库查询某一表的所有数据,估计100行吧,但是肯定不知道具体多少行,我们使用ResultSet来存储。那么我想取出最后一行的第一列的某一个字段值,怎么办呢?除了迭代还有什么好办法吗?我甚至有可能在一个方法内部多次使用到这样的需求:我就想随意的取出任意行的任意列。怎么办呢,反复迭代吗?有没有考虑过数据库连接的问题?

  就我目前的知识层次来说,我对以上问题在现有的ResultSet上,无能为力,不知道怎么办?我翻遍了我的JDK1.5的中文版文档也没能找到好的答案,我顿时觉得文档落伍了。JAVA的使用率较.Net更大,难道就找不到类似Datatable的数据集吗?我猜是有的,只是我使用的文档貌似是针对JAVA SE版本,可能没有涉及到更深入的企业级应用。

  在讲解Result之前,先说说目前大家都怎么来存储数据集吧。毫无疑问,在SSH框架中,大家都使用实体List,这样就很方便迭代,也很方便定位,而且在展现的时候借助Struts标签,很给力 。但是,我基本上是拒绝使用的,第一,目前SSH配合List使用的 查询语言HQL一点也不好用,也不快速(个人感觉)。第二,冗余字段,我只想查询一个表的两个字段,没必要查询出整个表的几十个字段吧!第三,表连接的问题,难道有什么完美的解决方案吗?难道有比join更好的吗?甚至有些人在没有使用ORM框架的情况下,先自行查询出ResultSet,而后再另行迭代封装到实体List中,这样做真的值得吗?

  Result:

    1,  定义

    表示数据库结果集的数据表。完整名称javax.servlet.jsp.jstl.sql.Result

    2,  获得

    为了得到Result,我们首先必须先要得到Result,然后使用ResultSupport.toResult(rs)转化即可。

        Statement stmt = con.createStatement(
                                      ResultSet.TYPE_SCROLL_INSENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE);
       ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
 

      Result rst = ResultSupport.toResult(rs);

    3,  迭代

    很不幸鄙人住处不能上网,无法下载阅读源代码,资料也比较匮乏,度娘和谷哥还有搜妹在这个问题也都没能给力,最后就只能一点点的尝试了。功夫不负有心人,终于被我发现以下用法:

for (SortedMap item : rst.getRows()) {

    }

    这种迭代方式并没有比ResultSet的更复杂,而且如果你愿意的话,你可以稍作修改使迭代可以从任意行开始,也可以从任意端开始。

    4,  取值

     由于Result中的每一行都是SortedMap,所以遵循规则:

     Object  value=item.get(key);( SortedMap的另外一些方法当然也适用)

     介绍完两个数据集,相信大家都有所了解了。其实他们的作用相同,用法也类似,大部分情况下,两者通用几乎没有什么问题。

     现在我尝试着使用Result解决一下刚刚标红还不能解决的问题。

      1,  取得最后一行第一列

    Object o= rst.getRowsByIndex()[rst.getRowCount()][0];

      这难道不够简单吗?

      2,  取得任意行任意列

     Object o= rst.getRowsByIndex()[行索引][列索引];

    请注意:一定要做好防范,避免抛出超出索引的异常。其他用法以后慢慢开发吧。另外还需要说明的是,一旦我们从ResultSet获得Result后,数据库连接即可释放,不会存在占用连接的情况。

    有些人说我就用实体List,让ResultSet和Result都见鬼去吧。

    我才不管呢!快速,直接,简单,抛弃冗余字段,我做的没错吧?

    至于大家怎么选择,随心吧。码农也是感性的。

java中result和resultSet的更多相关文章

  1. Java 中的resultset详解

    结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等. 结果集读取数据 ...

  2. java 中的resultset的类型

    结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等. 结果集读取数据 ...

  3. 第83节:Java中的学生管理系统分页功能

    第83节:Java中的学生管理系统分页功能 分页功能一般可以做成两种,一种是物理分页,另一种是逻辑分页.这两种功能是有各自的特点的,物理分页是查询的时候,对数据库进行访问,只是查一页数据就进行返回,其 ...

  4. 第80节:Java中的MVC设计模式

    第80节:Java中的MVC设计模式 前言 了解java中的mvc模式.复习以及回顾! 事务,设置自动连接提交关闭. setAutoCommit(false); conn.commit(); conn ...

  5. 第77节:Java中的事务和数据库连接池和DBUtiles

    第77节:Java中的事务和数据库连接池和DBUtiles 前言 看哭你,字数:8803,承蒙关照,谢谢朋友点赞! 事务 Transaction事务,什么是事务,事务是包含一组操作,这组操作里面包含许 ...

  6. 在Java中使用SQLite的教程(转)

    简介:这是在Java中使用SQLite的教程的详细页面,介绍了和java,有关的知识.技巧.经验,和一些java源码等. 简单的在Java中使用SQLite的教程 使用SQLiteJDBC封装 www ...

  7. java中regex参考

    在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包. 可粗略估计一下,除了偶尔用Linux的外,其他Linu ...

  8. java中instanceof的基本使用

    java中的instanceof运算符是用于判断对象是否是指定类或这个指定类的子类的一个实例,返回值是布尔类型. 语法: boolean result = object instanceof clas ...

  9. Java中连接MySql数据库的例子

    Java中连接MySql数据库的例子: package com.joinmysql.demo; import java.sql.DriverManager; import java.sql.Resul ...

随机推荐

  1. Java中List与数组互相转化

    问题的提出: 今天在完成一个小功能的时候,需要把存放在List中的数据转化成字符串数组.想当然地用了List的一个方法toArray(),它的返回值是Object[]类型,于是用强制类型转换.代码如下 ...

  2. Lagrange 乘子法求最优解

    clc clear syms x y z r1 r2 w f=x^+y^+z^+w^; g1=*x-y+z-w-; g2=x+y-z+w-; h=f-r1*g1 -r2*g2; hx=diff(h,x ...

  3. linux命令详解之useradd命令使用方法[linux下 添加用户、删除用户、修改用户密码、用户组管理]

    http://www.jb51.net/article/45848.htm Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这 ...

  4. ZOJ 2132 The Most Frequent Number (贪心)

    题意:给定一个序列,里面有一个数字出现了超过 n / 2,问你是哪个数字,但是内存只有 1 M. 析:首先不能开数组,其实也是可以的了,后台数据没有那么大,每次申请内存就可以过了.正解应该是贪心,模拟 ...

  5. Hadoop Hbase理论及实操

    Hbase特点 HBase是一个构建在HDFS上的分布式列存储系统:HBase是基于Google BigTable模型开发的,典型的key/value系统:HBase是Apache Hadoop生态系 ...

  6. servlet 解决乱码问题

    对于servlet大家应该都很熟悉了,今天再复习一下,如果有哪里写的不好或不对的地点希望广大的网友批评指正.今天只讨论get和post两w种方式,他们之间有很多的不同点,所以解决编码的方式也会不一样, ...

  7. Altera PLL应用中注意的问题

    无论是差分转单端信号还是单端信号转差分信号,都要都要用到altiobuf.而且在pin planner中要设置管脚的标准为差分的 而且要注意管脚的正负极性. 今天用FPGA做测试:把专门用于PLL的输 ...

  8. usb_ctrl

    IFCLK应该是clkout,与数据同步 flagd就是就是slcs FPGA的系统时钟用FX2LP的clkout时钟,个人觉得关键点在时钟是48M,别的异步时钟也是可以的. 模式配置 使用的模式是从 ...

  9. Effective C++ 随笔(5)

    条款27:尽量稍作转型动作 const_cast:常量性移除 dynamic_cast:安全向下转型 reinterpret_cast: static_cast: 如在子类当中享调用父类当中的某个方法 ...

  10. hdu 5047 大数找规律

    http://acm.hdu.edu.cn/showproblem.php?pid=5047 找规律 信kuangbin,能AC #include <stdio.h> #include & ...