数据库分页

MySql的数据库分页

  • 在MySQL中,如果是用limit 分页的要从0开始
  • 例如 limit 0,9
  • 是调用的前10条记录

数据库后台分页工具类

接口

package com.foreknow.util;




import java.util.List;

import com.foreknow.mapping.EntityMapping;


/**
 * 1.计算总记录数
 * 2.计算总页数
 * 3.查询某一个区间段的记录
 * @author Administrator
 *
 */
public interface Pagination {
    //判断当前所分的页是否为第一页
    public boolean isFirst();
    //判断当前所分的页是否为最后一页
    public boolean isLast();
    //判断是否还有下一页
    public boolean hasNext();
    //判断是否还有上一页
    public boolean hasPrevious();
    //返回当前要分页的总记录数
    public int getMaxElements();
    //返回总页数
    public int getMaxPages();
    //获得下一页的页码
    public int getNext();
    //返回上一页的页码
    public int getPrevious();
    //返回分页的大小,每页有多少条记录
    public int getPageSize();
    //返回当前页的页码
    public int getPageNumber();
    //返回当前页所包含的记录
    public List<Object> getList(EntityMapping mapping);
    //设定分页大小
    public void setPageSize(int pageSize);
    //设定当前要显示页面的页码
    public void setPageNumber(int pageNumber);

}

实现类

package com.foreknow.util;


import java.sql.Connection;
import java.util.List;
import java.util.regex.Pattern;

import com.foreknow.db.DBManager;
import com.foreknow.db.JdbcTemplate;
import com.foreknow.mapping.EntityMapping;
import com.foreknow.mapping.MappingFactory;



public class MysqlPagination implements Pagination {
    // 分页大小
    private int pageSize = 5;
    // 当前要显示的页码
    private int pageNumber = 1;
    // 最大页码
    private int maxPages;
    // 最大记录数
    private int maxElements;
    //准备的sql语句
    private String sql;
    private DBManager db;
    private JdbcTemplate jtm;
    private Connection conn;

    // private EntityMapping mapping;
    //构造器 参数为sql语句
    public MysqlPagination(String sql) {
        this.sql = sql;
        init();
    }
    
    //构造器 参数为sql语句,分页大小,当前要显示的页码
    public MysqlPagination(String sql, int pageSize, int pageNumber) {
        this.sql = sql;
        this.pageSize = pageSize;
        this.pageNumber = pageNumber;
        init();
        this.setPageNumber(pageNumber);
    }

    private void init() {
        //获取数据库连接
        db = DBManager.getInstance();
        conn = db.getConnection();
        //通过单例获得JdbcTemplate对象
        jtm = JdbcTemplate.getInstance();
        //设立连接
        jtm.setConnection(conn);
        // 获得最大的记录数的方法
        setMaxElements();
        setMaxPages();
    }

    // 获得最大的记录数
    private void setMaxElements() {
        // select * from xxx order by desc
        // select count(1) from xxx order by desc

        String regex = "select((.)+)from";
        Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        String[] s = p.split(this.sql);
        String newSql = "select count(1) as total from " + s[1];

        this.maxElements = jtm.query(newSql);
    }

    // 总页数,不足2页也算2页
    // 最大记录数/分页大小
    private void setMaxPages() {
        if (maxElements != 0 && (maxElements % pageSize == 0)) {
            maxPages = maxElements / pageSize;
        } else {
            maxPages = maxElements / pageSize + 1;
        }
    }

    /**
     * 在原有的sql基础上利用rownum通过子查询返回一个区间内的结果集 source 原有的sql begin 结果集开始点 end 结果集结束点
     select * from table limit (start-1)*limit,limit;
     */
    private String sqlModify(String source, int begin, int end) {
        StringBuffer target = new StringBuffer(200);
        target.append("select t.* from (");
        target.append(sql);      //类的属性 sql
        target.append(") t");
        target.append(" limit ");
        target.append(begin+",");
        target.append(end);
        return target.toString();
    }

    // ***********根据页码查找片断记录的起始索引***************start
    private int getBeginElement() {
        //limit 0,10  limit 10,10     limit 20,10
        //   0~9         10~19            20~29              每页显示10条数据
        return (pageNumber - 1) * pageSize;
    }
    
    private int getEndElement() {
        int endElement = pageSize;
        if (endElement >= maxElements) {
            return maxElements;
        } else {
            return endElement;
        }
    }

    // ***********根据页码查找片断记录的起始索引***************end

    public List<Object> getList(EntityMapping mapping) {
        // 计算list的起始索引
        String newSql = this.sqlModify(this.sql, this.getBeginElement(), this
                .getEndElement());
        return (List) jtm.query(newSql, mapping);
    }

    // public List<Object> getList(EntityMapping mapping) {
    // // mapping =
    // MappingFactory.getInstance().getMapping(MappingFactory.ADMIN_MAPPING);
    // // 计算list的起始索引
    // String newSql = this.sqlModify(this.sql, this.getBeginElement(), this
    // .getEndElement());
    // return (List) jtm.query(newSql, mapping);
    // }

    public int getMaxElements() {
        // TODO Auto-generated method stub
        return maxElements;
    }

    public int getMaxPages() {
        return maxPages;
    }

    // 返回下一页,如果当页就是最后一页,返回这页的数字
    public int getNext() {
        if (pageNumber + 1 >= this.getMaxPages()) {
            return getMaxPages();
        }
        return pageNumber + 1;
    }

    public int getPageNumber() {
        return pageNumber;
    }

    public int getPageSize() {
        return pageSize;
    }
    
    //如果页码-1就小于等于1,证明这是第一页,以前不能再减到0页了。
    public int getPrevious() {
        if (pageNumber - 1 <= 1) {
            return 1;
        } else {
            return pageNumber - 1;
        }
    }
        
    //如果当前页数比最大页码小,则证明还有下一页。
    public boolean hasNext() {
        return pageNumber < this.getMaxPages();
    }

    //如果当前页数比最小页码大,则证明还有前一页。
    public boolean hasPrevious() {
        return pageNumber > 1;
    }

    //如果当前页码等于1,则证明这页是第一页。
    public boolean isFirst() {
        return pageNumber == 1;
    }

    //如果当前页码大于等于最大页码,则证明这页是最后一页。
    public boolean isLast() {
        return pageNumber >= this.getMaxPages();
    }

    //设置当前页,如果传入的页码大于最大页码,那么显示最大页码的那一页数据,
    //如果传入的页码小于1,那么显示第一页的数据。如果不是二者,那么传入要求页码的数据。
    public void setPageNumber(int pageNumber) {
        if (pageNumber > maxPages) {
            this.pageNumber = maxPages;
        } else if (pageNumber < 1) {
            this.pageNumber = 1;
        } else {
            this.pageNumber = pageNumber;
        }
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;

    }
    
    public static void main(String[] args) {
        Pagination pagination = new MysqlPagination("select * from guestbook", 5, 5);
        System.out.println(pagination.getMaxElements());//计算总的记录数
        System.out.println(pagination.getMaxPages());//计算总页数
        MappingFactory mFactory = MappingFactory.getInstance();
        EntityMapping mapping = mFactory.getMap(MappingFactory.GUESTBOOK_MAPPING);
        List<Object> list = pagination.getList(mapping);//计算区间记录
        System.out.println(list.size());
        
    }

}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容