参考: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实现。