Java: 分页Paging的实现思路和Demo

1.为什么要分页?
首先是数据量太大会影响查询和传输的性能,关键是对用户来说一下看到数万条记录也不是那么友好。
2.有哪些分页技术?
a)存储过程分页
在数据库中创建一个存储过程,传入SQL和页码获得当前页的记录。需要对具体数据库的语法相当熟悉才能够编写,当然也可以直接google。性能最好,但不跨数据库平台
b)数据库专有sql特性分页
使用数据库专有的特性(MSSQL的top、Oracle的rownum、MySQL的limit等)实现当前页记录提取。性能也非常好,但也不跨数据库平台
c)纯JDBC分页
通过Statement的setMaxRow(endIndex)和rs.absoulte(beginIndex)仅取得当前页范围内的记录。此种方式的性能依赖于厂商对JDBC规范的实现,如果厂商的rs读取是以流的形式进行的,性能还是有所保障的。这种方式的通用性是最好的,完全与数据库平台无关了。
d)根据数据库类型自动生成数据库专有特性的sql语句
其实这就是Hibernate的实现方法,如果你觉得自己分析SQL语法然后将SQL转换为特定数据库语法比较麻烦,那就用Hibernate吧。

Jdbc分页Demo

package com.myjava.demo.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcPagingDemo {

    private static final int PAGE_SIZE = 2;

    public static void main(String[] args){
        String queryRowNumSQL = "select count(*) from t_email";
        String querySQL = "select * from t_email";
        int totalRow;

        try(Connection conn = getConnection()){
            Statement stat = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
            ResultSet result = stat.executeQuery(queryRowNumSQL);
            result.next();
            totalRow = result.getInt("count(*)");

            for(int beginIndex = 1; beginIndex <= totalRow;beginIndex += PAGE_SIZE){
                int endIndex = (beginIndex + PAGE_SIZE - 1) > totalRow ? totalRow : (beginIndex + PAGE_SIZE - 1);
                System.out.println("beginIndex : " + beginIndex + ", endIndex : " + endIndex);
                stat.setMaxRows(endIndex);
                result = stat.executeQuery(querySQL);
                result.absolute(beginIndex - 1);
                while(result.next()){
                    ResultSetMetaData metaData = result.getMetaData();
                    for(int i = 1; i <= metaData.getColumnCount();i++){
                        if(i == 1)
                            System.out.print(result.getString(i));
                        else
                            System.out.print("\t"+result.getString(i));
                    }
                    System.out.println();
                }
            }

            stat.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    private static Connection getConnection() throws SQLException{
        String driver = "com.mysql.jdbc.Driver";
        String url="jdbc:mysql://localhost:3306/vis_email";
        String username = "root";
        String password = "123456";
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return DriverManager.getConnection(url,username,password);
    }

}

Reference:
http://noahark007.blog.163.com/blog/static/5716526720122178844841/

你可能感兴趣的:(Java: 分页Paging的实现思路和Demo)