zoukankan      html  css  js  c++  java
  • 分页的几种方式

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

  • 相关阅读:
    linux sysfs (2)
    微软——助您启动云的力量网络虚拟盛会
    Windows Azure入门教学系列 全面更新啦!
    与Advanced Telemetry创始人兼 CTO, Tom Naylor的访谈
    Windows Azure AppFabric概述
    Windows Azure Extra Small Instances Public Beta版本发布
    DataMarket 一月内容更新
    和Steve, Wade 一起学习如何使用Windows Azure Startup Tasks
    现实世界的Windows Azure:与eCraft的 Nicklas Andersson(CTO),Peter Löfgren(项目经理)以及Jörgen Westerling(CCO)的访谈
    正确使用Windows Azure 中的VM Role
  • 原文地址:https://www.cnblogs.com/feibazhf/p/6259700.html
Copyright © 2011-2022 走看看