各种数据库分页及Java实现

分页汇总

在显示记录条目时往往要用到分页,一种常用的办法是利用各种数据库自带的定位接口对原始查询语句进行改写,从而只取出特定范围的某些记录。不同的数据库,查询定位接口是不一样的,下面做一汇总:

数据库 分页查询语句 说明
MSQL “QUERY_SQL limit ?,?” 使用limit关键字,第一个”?”是起始行号, 第二个”?”是返回条目数
Oracle SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (QUERY_SQL ) A WHERE ROWNUM <= ?) WHERE RN >= ? 结合rownum关键字,利用嵌套三层select 语句实现。第一个”?”表示终止行号, 第二个”?”表示起始行号
SqlServer 尚无通用语句 可使用top n来返回前n条记录或使用存储过程
DB2 假设查询语句:select t1.* from t1 order by t1.id; 分页语句可为:”select * from ( select rownumber() over (order by t1.id) as row_,t1.* from t1 order by t1.id) as temp_ where row_ between ?+1 and ?” 返回两个”?”之间的记录
PostgreSQL “QUERY_SQL limit ? offset ?” 第一个”?”为起始行号,第二个”?”代表返回记录数

Java实现

/**
 * @author Jiazhi
 * @since 2017/4/7
 */
public class PageSQLUtil {

    public static String DB_TYPE = "mysql";//mysql,postgrsql,oracle


    public static String pageSql(String sql, int pageNumber, int perPageSize) {
        return pageSql(sql, (long) pageNumber, (long) perPageSize);
    }

    public static String pageSql(String sql, long pageNumber, long perPageSize) {
        if (DB_TYPE.equals("mysql")) {
            return mysql(sql, pageNumber, perPageSize);
        } else if (DB_TYPE.equals("postgrsql")) {
            return postgrsql(sql, pageNumber, perPageSize);
        } else if (DB_TYPE.equals("oracle")) {
            return oracle(sql, pageNumber, perPageSize);
        } else {
            throw new RuntimeException("PageSQLUtil.DB_TYPE 错误");
        }
    }


    /**
     * @param pageNumber  1+
     * @param perPageSize 1+
     */
    public static String mysql(String sql, long pageNumber, long perPageSize) {
        long limit = (pageNumber - 1) * perPageSize;
        long offset = perPageSize;

        return sql + " LIMIT " + limit + "," + offset;
    }

    public static String postgrsql(String sql, long pageNumber, long perPageSize) {
        long limit = (pageNumber - 1) * perPageSize;
        long offset = perPageSize;

        return sql + " LIMIT " + limit + " OFFSET" + offset;
    }

    public static String oracle(String sql, long pageNumber, long perPageSize) {
        long limit = (pageNumber - 1) * perPageSize;
        long endRowNum = limit + perPageSize;

        return "SELECT * FROM " +
                " ( SELECT A.*, ROWNUM RN   FROM  " +
                " ( " + sql + " ) A   WHERE ROWNUM " +
                " <= " + endRowNum + ") WHERE RN >=  " + limit;
    }


}

参考文献:

1.[JAVA]几种流行的数据库SQL分页 http://blog.csdn.net/jie_java/article/details/486148

你可能感兴趣的:(【JDBC】,【JavaSE】)