JDBC2.0實現數據分頁

原创 2004年02月09日 00:11:00

JDBC2.0實現數據分頁<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

分頁操作在我們生成數據表格中是一個必不可少的步驟。不同于.net程序的封裝,在java程序中,我們必須要通過代碼實現或者通過某些提供這個功能的類庫。這次進行PDM Report的實現中對直接使用JDBC進行分頁進行了一些學習,把這些東西寫下來,希望對大家會有一些幫助。

一、實現方法

JDBC2.0中對於OracleSql Server都有三種方式實現分頁操作。分別是:
1
、使用針對特定數據庫的SQL
語句。
例如在Oracle中的
select ida<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2a2 from (select rownum r ,ida2a2 from phase) ss where ss.r > 54084 and ss.r <= 54134
Sql Server中的
select top 50 * from (select top 54134 ida2a2 from phase order by ida2a2) as a order by ida2a2 desc
2、使用ResultSet中的Next()方法。這個方法適用于所有的DB
        for(int i=0;i<54084;i++)

        {

          rs.next();

        }

        for(int i=0;i<50;i++)

        {

          rs.next();

        }

3、使用由JDBC2.0開始提供的absolute()方法,這個方法只有在
        rs.absolute(54084);

        for(int i=0;i<50;i++)

        {

          rs.next();

        }

二、數據比較

使用這三種方法我分別對Sql serverOracle的數據庫進行了一下簡單測試對應于兩台DB上數據行數相同的兩張表(phase),使用不同的分頁方法,分別取前50筆數據和最後五十筆數據,操作結束后計算所用時間。該表共有54134行數據,兩台DB運行于同一台pc。結果如下:

 

Sql for Oracle

Next for Oracle

Absolute for Oracle

Sql for Sql Server

Next for Sql Server

Absolute for Sql Server

First 50 row

0

0

32

78

78

703

Last 50 row

32

1515

1985

203

109

13875

First 50 row

0

0

31

78

94

468

Last 50 row

31

1703

2078

234

109

16719

First 50 row

0

0

31

78

78

453

Last 50 row

32

1578

2063

219

110

16813

從上面得粗率數據可以看出來使用特定的Sql語句在Oracle數據庫中進行分頁操作時最快的而且基本上不受數據行數大小的影響。之所以在表中的數據前50行顯示時間為零,估計主要是受了cache的影響。其他兩種方式的時間差距明顯。

對於Sql Server情況有些不同,使用Next的方式竟然是最快的,讓人難以理解。採用特定的Sql語句排序會受到行數的影響當時速度還可以忍受。

對於兩种DB來説,absolute方法的代價都是難以接受的,大家以後還少用為妙。

另外,Sql Server好像並不支持把top 後面的參數作爲prepare statement的參數,這個地方也請大家注意一下(如果哪位發現其實並不是如此,請告訴我一聲)。

 

PS:關於Hibernate

Hibernate中優先使用的是absolute方法。代碼如下
if ( session.getFactory().useScrollableResultSets() ) {
  // we can go straight to the first required row
  rs.absolute(firstRow);
}
else {
  // we need to step through the rows one row at a time (slow)
  for ( int m=0; m<firstRow; m++ ) rs.next();
}

對於可以直接使用Sql語句進行分頁操作的DB來説沒有問題,但是Sql ServerHibernate中並不支持偏移操作,也就是說會進行absolute方法,這樣一來他的分頁效率就比較讓人擔心了。如果大家有人使用Sql Server + Hibernate,請注意這一點。

將一個listview中的數據用ViewPager實現橫屏滑動分頁顯示

要使用ViewPager首先要导入包android-support-v4.jar 1、布局文件 main.xml 主界面
  • Hazard88
  • Hazard88
  • 2013年09月22日 10:13
  • 1160

从mysql数据库中导入数据到solr4.5

实际 项目中,我们需要把已存在于数据库中的数据导入到solr索引库中,solr给我们提供了一个非常简便的方式,下面我们以mysql数据为例。 假设我们数据名叫database,数据表叫user,u...
  • zhangyaoming2004
  • zhangyaoming2004
  • 2015年04月01日 12:09
  • 2367

修改hosts文件实现网页的屏蔽

servlet中的GetremoteAddr是获取远程主机ip的api,可以用来获取请求方的ip地址   ①当访问本机的web应用时GetremoteAddr获取到的是0:0:0:0:0:0:0:...
  • blacktone
  • blacktone
  • 2015年04月09日 21:15
  • 489

ThinkPHP3.2实现简单的数据分页

ThinkPHP3.2中实现了page类,同时配合数据表中的page()方法进行分页操作。 controller代码://实例化文案表 $local_articles = M...
  • helencoder
  • helencoder
  • 2015年12月21日 18:39
  • 3219

清空(數據庫中所有)表數據

1.delete 與 truncate delete 模式一般為 delete from table_name where {search_condition},可實現選擇性地刪除表中某些條記錄,當沒...
  • Benjayming
  • Benjayming
  • 2013年08月13日 21:52
  • 869

大數乘法 【STL,字符串實現】

原理: 選相對較大的數來做加法(即乘法原理)  【字符串實現】 個人感覺效率不好,有待改進。當兩個數字都很大的時候,就會做多次循環。望各位指教 #include #include #incl...
  • ChristopherWu
  • ChristopherWu
  • 2014年01月04日 20:56
  • 700

Hibernate(六)实现一对多、多对一映射关联关系

一对多、多对一这种关系在现实生活中很多,例如部门与员工的关系,学校里班级与学生的关系... 那么在具体的系统实现中如果i实现这种关联关系呢?这里以部门和员工的关系为例。 部门实体类 package t...
  • u011731233
  • u011731233
  • 2015年07月16日 09:12
  • 3410

基本数据结构(C#实现):顺序表

线性表的顺序存储结构,指的是用一段地址连续的存储单元一次存储线性表的数据元素。顺序表,一般采用一维数组来实现。代码实现: 顺序表类class SequenceList { p...
  • lzuwds
  • lzuwds
  • 2015年04月10日 10:18
  • 312

简单日程表的实现

使用了BeautyEye优化界面 简单的日历查询功能 简单的提醒功能(倒计时向)查询界面的实现 package CalendarExp;import org.jb2011.lnf.beautyeye....
  • Len_master
  • Len_master
  • 2016年12月28日 22:05
  • 593

修改數據庫實例名及數據庫名

修改數據庫實例名及數據庫名 ======================修改數據庫實例名及數據庫名 BU3DB to GEDT 1.startup mount; 2.create pf...
  • u012542750
  • u012542750
  • 2014年11月18日 11:19
  • 108
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JDBC2.0實現數據分頁
举报原因:
原因补充:

(最多只允许输入30个字)