现在的位置: 首页 > 综合 > 正文

以简求快 Java快速开发框架LML数据集之Result和ResultSet

2013年04月26日 ⁄ 综合 ⁄ 共 2826字 ⁄ 字号 评论关闭

         世界这么大,而我这么小,我还有什么脸面骄傲,我拿什么去自豪!唯有不停地求知,才能获得一点点的安慰。

         我一直坚持着一个这样的定理:关于语言的用法,永远是官方文档最靠谱。

         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都见鬼去吧。

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

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

下集预告:首页根据角色的菜单展现以及网页架构。

抱歉!评论已关闭.