java 分页

本文介绍了两种常见的分页技术实现方式,一种是基于缓存的分页实现,另一种是基于数据库查询的分页实现,并详细解释了各自的优缺点。此外,还提供了一个具体的分页模型示例,展示了如何在实际项目中应用这些分页技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分页是我们在做项目的时候经常会遇到的技术点之一,分页技术从设计的角度考虑主要分为两大类:
1.基于缓存的分页实现
2.基于数据库查询的分页实现
两者在使用上各有优缺点:
第1种实现方式将数据库中的所有符合要求的数据一次性装入内存,然后通过List的sublist方法进行分页,优点在于不必频繁访问数据库,缺点是当数据量非常大的时候,对内存配置的要求比较高.
第2种实现方式是通过数据库的限制条件,每次查询一定数目的数据,如通过oracle中的rownum加上where限制条件.优点在于每次取出一定数目的数据,内存使用较小,缺点是需要频繁的访问数据库.

示例:

1、定义分页模型:PageModel

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package com.common.page; 
   
import java.util.List; 
   
/**
  * 封装分页信息
  * @author Administrator
  *
  */ 
public class PageModel<E> { 
   
     //结果集 
     private List<E> list; 
       
     //查询记录数 
     private int totalRecords; 
       
     //每页多少条数据 
     private int pageSize; 
       
     //第几页 
     private int pageNo; 
       
     /**
      * 总页数
      * @return
      */ 
     public int getTotalPages() { 
         return (totalRecords + pageSize -  1 ) / pageSize; 
    
       
     /**
      * 取得首页
      * @return
      */ 
     public int getTopPageNo() { 
         return 1
    
       
     /**
      * 上一页
      * @return
      */ 
     public int getPreviousPageNo() { 
         if (pageNo <=  1 ) { 
             return 1
        
         return pageNo -  1
    
       
     /**
      * 下一页
      * @return
      */ 
     public int getNextPageNo() { 
         if (pageNo >= getBottomPageNo()) { 
             return getBottomPageNo(); 
        
         return pageNo +  1 ;   
    
       
     /**
      * 取得尾页
      * @return
      */ 
     public int getBottomPageNo() { 
         return getTotalPages(); 
    
       
     public List<E> getList() { 
         return list; 
    
   
     public void setList(List<E> list) { 
         this .list = list; 
    
   
     public int getTotalRecords() { 
         return totalRecords; 
    
   
     public void setTotalRecords( int totalRecords) { 
         this .totalRecords = totalRecords; 
    
   
     public int getPageSize() { 
         return pageSize; 
    
   
     public void setPageSize( int pageSize) { 
         this .pageSize = pageSize; 
    
   
     public int getPageNo() { 
         return pageNo; 
    
   
     public void setPageNo( int pageNo) { 
         this .pageNo = pageNo; 
    
}
2、分页测试:在MySQL中建立admin表,里面有字段id、name、password

3、建立Admin的实体bean类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.common.page; 
   
public class Admin { 
     private int id; 
     private String name; 
     private String password; 
     public int getId() { 
         return id; 
    
     public void setId( int id) { 
         this .id = id; 
    
     public String getName() { 
         return name; 
    
     public void setName(String name) { 
         this .name = name; 
    
     public String getPassword() { 
         return password; 
    
     public void setPassword(String password) { 
         this .password = password; 
    
   
}

4、测试调用:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package com.common.page; 
   
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.ArrayList; 
import java.util.List; 
   
import com.common.db.DbUtil; 
   
public class Client { 
     public static PageModel findAdmins( int pageNo, int pageSize){ 
         Connection conn=DbUtil.getConnection(); 
         String sql= "select * from admin limit ?,?"
         PageModel pageModel= null
         PreparedStatement pstm= null
         ResultSet rs= null
         Admin admin= null
         List<Admin> list= new ArrayList<Admin>(); 
         try
             pstm=conn.prepareStatement(sql); 
             pstm.setInt( 1 , (pageNo- 1 )*pageSize); 
             pstm.setInt( 2 , pageNo*pageSize); 
             rs=pstm.executeQuery();; 
             while (rs.next()){ 
                 admin= new Admin(); 
                 admin.setId(rs.getInt( "a_id" )); 
                 admin.setName(rs.getString( "a_name" )); 
                 admin.setPassword(rs.getString( "a_pwd" )); 
                 list.add(admin); 
            
             ResultSet rs2=pstm.executeQuery( "select count(*) from admin" ); 
             int total= 0
             if (rs2.next()){ 
                 total=rs2.getInt( 1 ); 
            
             pageModel= new PageModel(); 
             pageModel.setPageNo(pageNo); 
             pageModel.setPageSize(pageSize); 
             pageModel.setTotalRecords(total); 
             pageModel.setList(list); 
         catch (SQLException e) { 
             e.printStackTrace(); 
         } finally
             DbUtil.close(conn); 
             DbUtil.close(pstm); 
             DbUtil.close(rs); 
        
         return pageModel; 
    
       
     public static void main(String[] args) { 
         PageModel pageModel=Client.findAdmins( 2 , 4 ); 
         List<Admin> list=pageModel.getList(); 
         for (Admin a:list){ 
             System.out.print( "ID:" +a.getId()+ ",用户名:" +a.getName()+ ",密码:" +a.getPassword()); 
             System.out.println(); 
        
         System.out.print( "当前页:" +pageModel.getPageNo()+ " " ); 
         System.out.print( "共" +pageModel.getTotalPages()+ "页  " ); 
         System.out.print( "首页:" +pageModel.getTopPageNo()+ " " ); 
         System.out.print( "上一页:" +pageModel.getPreviousPageNo()+ " " ); 
         System.out.print( "下一页:" +pageModel.getNextPageNo()+ " " ); 
         System.out.print( "尾页:" +pageModel.getBottomPageNo()+ " " ); 
         System.out.print( "共" +pageModel.getTotalRecords()+ "条记录" ); 
         System.out.println(); 
    
   
}
这样分页效果就实现了,我们要实现分页效果,只要传入相应的参数和相应的数据库执行语句即可实现,希望大家能灵活运用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值