分页的几种方式

参考:http://lixor.iteye.com/blog/765255

        http://www.cnblogs.com/wllyy189/archive/2008/07/07/1237478.html

        http://bbs.csdn.net/topics/310149896

参考了上面的博客,分页实现有很多种,有存储过程分页,数据库特有SQL特性分页, 纯JDBC分页,Hibernate分页,下面是其中一种分法

 

一.逻辑分页

 
先将Statement 对象生成的所有 ResultSet 对象可以包含的最大行数给限制(利用setMaxRows方法),然后利用JDBC的absolute定位到起始位置,这种方法适用于数据量不是很大的分页,如果数据量很大,比如100W条数据,越往后翻越慢,如果数据量比较大的数据,请采用物理分页。(JDBC分页核心代码如下:)

 

 1         Connection conn = DBUtil.getConnection(); // 获取数据库连接
 2         // 分页查询的SQL语句
 3         String sql = "select * from tb_book order by id asc";
 4         // 过滤结果集的变量
 5             int skipBegin = (pagebean.getCurrentPage() - 1) * pagebean.getPageSize();
 6             int skipEnd = pagebean.getCurrentPage() * pagebean.getPageSize();
 7      
 8         // 当返回结果集中有记录时
 9         try {
10             
11             Statement st = conn.createStatement();  
12             st.setMaxRows(skipEnd);//关键代码,设置最大记录数为当前页记录的截止下标  
13             ResultSet rs = st.executeQuery(sql);  
14                 if (skipBegin > 0) {  
15                 rs.absolute(skipBegin);//关键代码,直接移动游标为当前页起始记录处  
16             }          
17             while (rs.next()) { // 光标向后移动,并判断是否有效
18 
19                     BookBean b = new BookBean(); // 实例化BookBean
20                     b.setId(rs.getInt("id")); // 对id属性赋值
21                     b.setName(rs.getString("name")); // 对name属性赋值
22                     b.setPrice(rs.getFloat("price")); // 对price属性赋值
23                     b.setBookCount(rs.getInt("bookCount")); // 对bookCount属性赋值
24                     b.setAuthor(rs.getString("author")); // 对author属性赋值
25                     list.add(b); // 将BookBean添加到List集合中
26         
27             }
28             rs.close(); // 关闭ResultSet
29             st.close(); // 关闭PreparedStatement
30             conn.close(); // 关闭Connection
31         } catch (SQLException e) {
32             e.printStackTrace();
33         }
34         return list;
35     }

 

 

 

 

二、物理分页

利用数据库本身的一些特性来分页。即:利用了数据库对sql语法的优化,提高分页性能。

Mysql limit分页如下:

 

 1     public List<BookBean> find(int page) {
 2         List<BookBean> list = new ArrayList<BookBean>(); // 创建List
 3         PageBean pagebean = new PageBean();
 4         Connection conn = DBUtil.getConnection(); // 获取数据库连接
 5         // 分页查询的SQL语句
 6         String sql = "select * from tb_book order by id asc limit ?,?";
 7         try {
 8             PreparedStatement ps = conn.prepareStatement(sql); // 获取PreparedStatement
 9             ps.setInt(1, (page - 1) * pagebean.getPageSize()); // 对SQL语句中的第1个参数赋值
10             ps.setInt(2, pagebean.getPageSize()); // 对SQL语句中的第2个参数赋值
11             ResultSet rs = ps.executeQuery(); // 执行查询操作
12             while (rs.next()) { // 光标向后移动,并判断是否有效
13                 BookBean b = new BookBean(); // 实例化BookBean
14                 b.setId(rs.getInt("id")); // 对id属性赋值
15                 b.setName(rs.getString("name")); // 对name属性赋值
16                 b.setPrice(rs.getFloat("price")); // 对price属性赋值
17                 b.setBookCount(rs.getInt("bookCount")); // 对bookCount属性赋值
18                 b.setAuthor(rs.getString("author")); // 对author属性赋值
19                 list.add(b); // 将BookBean添加到List集合中
20             }
21             rs.close(); // 关闭ResultSet
22             ps.close(); // 关闭PreparedStatement
23             conn.close(); // 关闭Connection
24         } catch (SQLException e) {
25             e.printStackTrace();
26         }
27         return list;
28     }

 

 

Oracle特有的是利用 Rownum实现,三层嵌套,具体就不实现了,核心代码如下:

 

 完整代码下载地址:

链接:http://pan.baidu.com/s/1c2Mgfj6 密码:r3a5

 

 

如果大家想把界面做的更漂亮,可以结合一些主流的一些框架,比如Jquery Pagination、BootStrap分页组件pagination实现。

 

转载于:https://www.cnblogs.com/feibazhf/p/6259700.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值