• 分页的几种方式


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

  • 相关阅读:
    Nbimer族助手 部分控件不能用的解决方法(转)
    jquery中通过全局变量来禁止多次ajax请求
    Three.JS 从世界坐标系转换到屏幕坐标系
    php 判断是手机版还是电脑端
    6个html5页面适配iphone6的技巧
    http://stackoverflow.com/questions/6065169/requestanimationframe-with-this-keyword
    javascript模仿php 函数 trim ltrim rtrim (原创)
    JavaScript中Trim(),TrimStart(),TrimEnd()的实现
    如何定位摄像机,使物体在屏幕上始终具有相同的像素宽度和高度?(threes)
    鸿基台式机安装
  • 原文地址:https://www.cnblogs.com/feibazhf/p/6259700.html
Copyright © 2020-2023  润新知