缺省情况下创建的ResultSet 是一种只能访问一次(one-time-through),只能向前访问(forward-only),只读的对象。您只能访问数据一次,如果再次需要该数据,必须重新查询数据库。ResultSet.TYPE_SCROLL_SENSITIVE双向滚动,并及时跟踪数据库的更新,以便更改ResultSet中的数据。允许在记录中定位。这种类型受到其他用户所作更改的影响。如果用户在执行完查询之后删除一个记录,那个记录将从 ResultSet 中消失。类似的,对数据值的更改也将反映在 ResultSet 中。(其它人对记录的修改会反应到你打开的记录集   敏感)ResultSet.TYPE_SCROLL_INSENSITIVE双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来。允许在列表中向前或向后移动,甚至可以进行特定定位,例如移至列表中的第四个记录或者从当前位置向后移动两个记录。不会受到其他用户对该数据库所作更改的影响。(其它人对记录的修改不会反应到你打开的记录集   不敏感)TYPE_FORWORD_ONLY只可向前滚动。缺省类型,不会受到其他用户对该数据库所作更改的影响。只允许向前访问一次,并且不会受到其他用户对该数据库所作更改的影响。例如对三面的三个类型,我是链接MySQL5.0做测试的,但是似乎设置这些类型根本就没有作用,例如采用默认的ResultSet类型,也可以向后滚动,absolute()也可以用,就算设置成TYPE_FORWORD_ONLY也可以先后滚动,而设置成TYPE_SCROLL_SENSITIVE,即使数据库的内容更改了,也不会反映到ResultSet中,
所以对这些类型的设置感到比较迷惑,不知道是不是使用的不对?
请大家指教~

解决方案 »

  1.   

    参考http://topic.csdn.net/u/20080916/23/98b77d20-25ce-47ec-befd-a35e380e0ae5.html
      

  2.   

    【引用】
    JDBC对数据库进行数据查询时,数据库会创建查询结果的cache和cursor。而数据库的cursor是不支持backforward,random,last,first操作,仅仅只支持向前forward。那么TYPE_SCROLL_INSENSITIVE是如何实现支持backforward,random,last,first的呢?很简单,TYPE_SCROLL_INSENSITIVE的Statement查询把所有fetch的记录都缓存到JVM的Resultset对象内,如果有10个记录,直接跳到最后记录,TYPE_SCROLL_INSENSITIVE方式下把fetch所有记录到jvm端,并缓存下来,再进行random就是在数据库数组里面进行的。这也是TYPE_FORWARD_ONLY类型通常是效率最高最快的cursor类型原因,如果要做一些复杂的功能,必然是要牺牲一些效率的。TYPE_FORWARD_ONLY类型通常是效率最高最快的cursor类型,也是最常用的选择
    TYPE_SCROLL_INSENSITIVE需要在jvm中cache所有fetch到的记录实体,在大量记录集返回时慎用
    TYPE_SCROLL_SENSITIVE在jvm中cache所有fetch到的记录rowid,需要进行二次查询,效率最低,开销最大
    【End 引用】个人觉得如果你执行的结果跟JDBC规范不一致,可能是导入的Jar包并没有严格遵循JDBC出台的规范而仅仅是对它基本功能的一个实现!
      

  3.   

    【引用】 
    JDBC对数据库进行数据查询时,数据库会创建查询结果的cache和cursor。而数据库的cursor是不支持backforward,random,last,first操作,仅仅只支持向前forward。那么TYPE_SCROLL_INSENSITIVE是如何实现支持backforward,random,last,first的呢?很简单,TYPE_SCROLL_INSENSITIVE的Statement查询把所有fetch的记录都缓存到JVM的Resultset对象内,如果有10个记录,直接跳到最后记录,TYPE_SCROLL_INSENSITIVE方式下把fetch所有记录到jvm端,并缓存下来,再进行random就是在数据库数组里面进行的。这也是TYPE_FORWARD_ONLY类型通常是效率最高最快的cursor类型原因,如果要做一些复杂的功能,必然是要牺牲一些效率的。 TYPE_FORWARD_ONLY类型通常是效率最高最快的cursor类型,也是最常用的选择 
    TYPE_SCROLL_INSENSITIVE需要在jvm中cache所有fetch到的记录实体,在大量记录集返回时慎用 
    TYPE_SCROLL_SENSITIVE在jvm中cache所有fetch到的记录rowid,需要进行二次查询,效率最低,开销最大 
    【End 引用】 
      

  4.   

    基于ResultSet的特性,所以在查询数据库表的时候,一般都是写一个这种类型的函数:
    public List query(Map map)
    {
    ...
    //return 一个ArrayList
    }或者
    public List queryAll()
    {
    ...
    //return 一个ArrayList
    }
    说白了就是说在查询时,通过迭代ResultSet中的内容,将获取的对象逐个存入ArrayList对象中即可!