我总结的,你看看。
下面经过我测试,肯定正确。
你自己再理理。
目前比较广泛使用的分页方式是将查询结果缓存在HttpSession或有状态bean中,翻页的时候从缓存中取出一页数据显示。这种方法有两个主要的缺点:一是用户可能看到的是过期数据;二是如果数据量非常大时第一次查询遍历结果集会耗费很长时间,并且缓存的数据也会占用大量内存,效率明显下降。
其它常见的方法还有每次翻页都查询一次数据库,从ResultSet中只取出一页数据(使用rs.last();rs.getRow()获得总计录条数,使用rs.absolute()定位到本页起始记录)。这种方式在某些数据库(如oracle)的JDBC实现中差不多也是需要遍历所有记录,实验证明在记录数很大时速度非常慢。
至于缓存结果集ResultSet的方法则完全是一种错误的做法。因为ResultSet在Statement或Connection关闭时也会被关闭,如果要使ResultSet有效势必长时间占用数据库连接。
因此比较好的分页做法应该是每次翻页的时候只从数据库里检索页面大小的块区的数据。这样虽然每次翻页都需要查询数据库,但查询出的记录数很少,网络传输数据量不大,如果使用连接池更可以略过最耗时的建立数据库连接过程。而在数据库端有各种成熟的优化技术用于提高查询速度,比在应用服务器层做缓存有效多了。
在oracle数据库中查询结果的行号使用伪列ROWNUM表示(从1开始)。例如select * from employee where rownum<10 返回前10条记录。但因为rownum是在查询之后排序之前赋值的,所以查询employee按birthday排序的第100到120条记录应该这么写:
select * from ( select my_table.*, rownum as my_rownum from ( select name, birthday from employee order by birthday ) my_table where rownum <120 ) where my_rownum>=100
mySQL可以使用LIMIT子句:
select name, birthday from employee order by birthday LIMIT 99,20
DB2有rownumber()函数用于获取当前行数。
SQL Server没研究过,
在WEB的项目中,总免不了要分页,在以前的项目中一般都是采用SQL语言去分页,但SQL语言不好的一个
地方就是每种数据库可能有一些不同,用hibernate是可以解决这个问题,但是我们的项目没有用到任何
框架,主要的技术是jsp+javaBean+servlet,是表现层我采用的是面向对象的方法,数据库中的每个表对
应一个javaBean,表中的每条记录就是一个javaBean的对象,所以分页程序我也采用面向对象,只要在前
台拿到一个表的所有记录,用一个list存起来,然后用进list进行分页即可.
具体的分页程序如下:
1 import java.util.*;
2
3 /**
4 * 些类负责分页显示
5 * @author feng
6 */
7 public class Pagination<E>
8 {
9 private int pageSize;;//每页记录数
10 private int pageCount;//总页数
11
12
13 public List<E> getList(List<E> list,int pageCur){
14 List<E> pageList = new ArrayList<E>();
15 int count = 0;
16 count = list.size();
17 if( count < pageCur*pageSize){
18 for(int i = (pageCur-1)*pageSize;i< count;i++){
19 pageList.add(list.get(i));
20 }
21 }else{
22 for(int i = (pageCur-1)*pageSize;i< pageCur*pageSize;i++){
23 pageList.add(list.get(i));
24 }
25 }
26 return pageList;
27 }
28
29 public int getPageCount(List<E> list){
30 int sum = 0;
31 sum = list.size();
32 pageCount = sum/pageSize + 1;
33 return pageCount;
34 }
35
36 public int getPageSize(){
37 return this.pageSize;
38 }
39 public void setPageSize(int pageSize){
40 this.pageSize = pageSize;
41 }
42 }
43
在前台只要把数据库的数据取出,将他放进List中,然后进行分页即可,例如:
有一表user,对应有javaBean为User,先声明一个List
List<User> list =new List<User>();
然后将user表中的所有记录查出,然后add进list中,
下面是分页
Pagination<User> p = new Pagination<User>();
p.setPageSize(10);
pageCount = p.getPageCount(list);
list = p.getList(list,1)
返回的list就是一页的对象了,按顺序取出显示即可.
如果数据库里有1000万条记录,你就把1000万条全取出来?
1.这样每次都取全部记录,对数据库的压力非常大,性能非常差
2.全部记录都取出来,放在List中,会造成内存溢出