gridview 分页插件pagecount总页数是怎么得到的_你该了解的那些事:数据量、JAVA分页...

本文介绍了在Java中处理大数据量分页的方法,包括小数据量时直接使用`list.subList()`进行分页,以及针对大数据量在DAO层进行分页操作。同时,文章讲解了如何获取总页数PageCount,以及在Spring MVC和Hibernate环境下实现分页的工具类和初始化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bfb0302b21a6945c3ee1abfbbfc4fb68.png

Written In The Font

分页虽易,好却难.数据量,怎么办?

Content

分页(Paging),就像个切面.能把这个切面好好的放进去也是种nice方式.

第一种:小数据量分页实现 (可广泛用于 门户型 网页快速开发等)


这种比较简单,这边我们模拟实现.

字段结构:

  • private int pageSize; //每页有多少条
  • private int rowCount; //总行数
  • private int pageCount;//总页数
  • private int currentPage; //当前页码

流程结构:

c89eea13b122c62daa1a89e6a1624492.png

核心:
list.subList(index, (currentPage < pageCount) ? (index + pageSize) : rowCount);将小数据量集合,根据分页参数返回指定的list部分.这样,如果数据小的话,这样很方便的实现了分页功能.下面是JDK api里面对方法的解释:

subList(int fromIndex, int toIndex)
返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。

分页工具类:

a119c4735b09c4de0c6cd0bca2bc5188.gif
package jeffli_10;import java.util.ArrayList;import java.util.List;/** 分页类:根据总记录数和分页大小对 {@link List} 进行分页处理 */public class Pagination{    public static final int DEFAULT_PAGE_SIZE = 10;        private int rowCount;    private int currentPage;    private int pageSize;    private int pageCount;        private List> list;        public Pagination(List> list)    {        this(list, DEFAULT_PAGE_SIZE);    }        public Pagination(List> list, int pageSize)    {        this.currentPage    = 1;        this.list            = list;        this.rowCount        = list.size();                setPageSize(pageSize);    }        private void adjustPageCount()    {        pageCount = (rowCount + pageSize - 1) / pageSize;    }        /** 获取要分页的 {@link List}  */    public List> getList()    {        return list;    }        /** 获取的 {@link List} 当前页内容 */    public List> getCurrentList()    {        List> currentList = null;                if(currentPage >= 1 && currentPage <= pageCount)        {            int index = (currentPage - 1) * pageSize;            currentList = list.subList(index, (currentPage = 1 && page <= pageCount)        {            currentPage = page;            return true;        }                return false;    }        /** 转到下一页 */    public boolean nextPage()    {        return setCurrentPage(currentPage + 1);    }    /** 转到上一页 */    public boolean prePage()    {        return setCurrentPage(currentPage - 1);    }    /** 获取分页大小 */    public int getPageSize()    {        return pageSize;    }    /** 设置分页大小 */    public void setPageSize(int size)    {        if(size <= 0)            size = DEFAULT_PAGE_SIZE;                int index = (currentPage - 1) * pageSize;                pageSize = size;                        if(index > pageSize)            currentPage = (index + pageSize - 1) / pageSize;        else            currentPage = 1;            adjustPageCount();    }    /** 获取总页数 */    public int getPageCount()    {        return pageCount;    }            public static void main(String[] args)    {        final int PAGE_SIZE        = 10;        final int LIST_SIZE        = 39;                List list = new ArrayList();        for(int i = 1; i <= LIST_SIZE; i++)            list.add(i);                Pagination pg = new Pagination(list, PAGE_SIZE);                for(int i = 1; i <= pg.getPageCount(); i++)        {                pg.setCurrentPage(i);                System.out.println(pg.getCurrentList());        }    }    }
885d24f69bcd6eeac5f0d6a83d792e79.gif

RUN,你会看到 OUTPUTS:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10][11, 12, 13, 14, 15, 16, 17, 18, 19, 20][21, 22, 23, 24, 25, 26, 27, 28, 29, 30][31, 32, 33, 34, 35, 36, 37, 38, 39]

第二种:大数据量,采取DAO层分页操作(普遍性需求)


环境:

spring MVC (spring-4.0.0.RELEASE.jar)

hibernate (hibernate-core-4.3.5.Final.jar)

Mysql

两个核心工具类-分页

分页对象,包含所需要的所有参数及逻辑.

f48f1d10ca92a3c7b573b4595a43a473.gif
package sedion.jeffli.wmuitp.util;import java.util.List;import org.apache.commons.lang3.StringUtils;import com.google.common.collect.Lists;public class Page {    //public variables     public static final String ASC     = "asc";    public static final String DESC = "desc";    //parameters of page    protected int pageNo         = 1;    protected int pageSize         = -1;        protected String orderBy     = null;    protected String order         = null;        protected boolean autoCount = true;    //results    protected long totalCount     = -1;    protected List result     = Lists.newArrayList();    public Page()     {            }    public Page(int pageSize)     {        this.pageSize = pageSize;    }    /**     * 获得当前页的页号,序号从1开始,默认为1.     */    public int getPageNo()     {        return pageNo;    }    /**     * 设置当前页的页号,序号从1开始,低于1时自动调整为1.     */    public void setPageNo(final int pageNo)     {        this.pageNo = pageNo;        if (pageNo  pageNo(final int thePageNo)     {        setPageNo(thePageNo);        return this;    }    /**     * 获得每页的记录数量, 默认为-1.     */    public int getPageSize()     {        return pageSize;    }    /**     * 设置每页的记录数量.     */    public void setPageSize(final int pageSize)     {        this.pageSize = pageSize;    }    /**     * 返回Page对象自身的setPageSize函数,可用于连续设置。     */    public Page pageSize(final int thePageSize)     {        setPageSize(thePageSize);        return this;    }    /**     * 根据pageNo和pageSize计算当前页第一条记录在总结果集中的位置,序号从1开始.     */    public int getFirst()     {        return ((pageNo - 1) * pageSize) + 1;    }    /**     * 获得排序字段,无默认值. 多个排序字段时用','分隔.     */    public String getOrderBy()     {        return orderBy;    }    /**     * 设置排序字段,多个排序字段时用','分隔.     */    public void setOrderBy(final String orderBy)     {        this.orderBy = orderBy;    }    /**     * 返回Page对象自身的setOrderBy函数,可用于连续设置。     */    public Page orderBy(final String theOrderBy)     {        setOrderBy(theOrderBy);        return this;    }    /**     * 获得排序方向, 无默认值.     */    public String getOrder()     {        return order;    }    /**     * 设置排序方式向.     *      * @param order     *            可选值为desc或asc,多个排序字段时用','分隔.     */    public void setOrder(final String order)     {        String lowcaseOrder = StringUtils.lowerCase(order);        String[] orders = StringUtils.split(lowcaseOrder, ',');        for (String orderStr : orders) {            if (!StringUtils.equals(DESC, orderStr) && !StringUtils.equals(ASC, orderStr)) {// 检查order字符串的合法值                throw new IllegalArgumentException("排序方向" + orderStr + "不是合法值");            }        }        this.order = lowcaseOrder;    }    /**     * 返回Page对象自身的setOrder函数,可用于连续设置。     */    public Page order(final String theOrder)     {        setOrder(theOrder);        return this;    }    /**     * 是否已设置排序字段,无默认值.     */    public boolean isOrderBySetted()     {        return (StringUtils.isNotBlank(orderBy) && StringUtils.isNotBlank(order));    }    /**     * 获得查询对象时是否先自动执行count查询获取总记录数, 默认为false.     */    public boolean isAutoCount()     {        return autoCount;    }    /**     * 设置查询对象时是否自动先执行count查询获取总记录数.     */    public void setAutoCount(final boolean autoCount)     {        this.autoCount = autoCount;    }    /**     * 返回Page对象自身的setAutoCount函数,可用于连续设置。     */    public Page autoCount(final boolean theAutoCount)     {        setAutoCount(theAutoCount);        return this;    }    // -- 访问查询结果函数 --//    /**     * 获得页内的记录列表.     */    public List getResult()     {        return result;    }    /**     * 设置页内的记录列表.     */    public void setResult(final List result)     {        this.result = result;    }    /**     * 获得总记录数, 默认值为-1.     */    public long getTotalCount()     {        return totalCount;    }    /**     * 设置总记录数.     */    public void setTotalCount(final long totalCount)     {        this.totalCount = totalCount;    }    /**     * 根据pageSize与totalCount计算总页数, 默认值为-1.     */    public long getTotalPages()     {        if (totalCount  0)             count++;        return count;    }    /**     * 是否还有下一页.     */    public boolean isHasNext()    {        return (pageNo + 1 <= getTotalPages());    }    /**     * 取得下页的页号, 序号从1开始. 当前页为尾页时仍返回尾页序号.     */    public int getNextPage()     {        if (isHasNext())            return pageNo + 1;        else             return pageNo;    }    /**     * 是否还有上一页.     */    public boolean isHasPre()     {        return (pageNo - 1 >= 1);    }    /**     * 取得上页的页号, 序号从1开始. 当前页为首页时返回首页序号.     */    public int getPrePage()     {        if (isHasPre())             return pageNo - 1;        else             return pageNo;    }    public long getBegin()     {        return Math.max(1, getPageNo() - pageSize / 2);    }    public long getEnd()     {        return getTotalPages();    }}
746c5add9461451357f76c81b1317755.gif

分页初始化(包括参数变化)

abf6d0645ace4ca302a638d30b0fbf15.gif
package sedion.jeffli.wmuitp.util;import javax.servlet.http.HttpServletRequest;import org.apache.commons.lang3.StringUtils;import com.sun.org.apache.xml.internal.resolver.helpers.PublicId;import sedion.jeffli.wmuitp.entity.SubjectInfor;/** * 分页工具 *  */public class PageUtil {    public static int PAGE_SIZE             = 20;    public static int MAX_SIZE              = 9999;        public static final String PAGE_NUM_STR = "pageNum";        /**     * 初始化分页     * @param page        page对象     * @param request     请求体     * @return     */    public static int[] init(Page> page, HttpServletRequest request) {                int pageNum = Integer.parseInt(StringUtils.defaultIfBlank(request.getParameter(PAGE_NUM_STR), "1"));                page.setPageNo(Integer.valueOf(pageNum));        page.setPageSize(page.getPageSize());                int firstResult = page.getFirst() - 1;        int maxResults = page.getPageSize();                return new int[] { firstResult, maxResults };    }}
a7f333c6b630c7fcdfc72aef1913f865.gif

这里我们用request.getParameter(PAGE_NUM_STR) 获取分页操作时改变的字段.这样不必要每次都在Controller上附带参数了.

页面端:

75a43dd0c5423e3e8da9501de4daf538.gif
                            
        
            显示                                selected#if>>20                        selected#if>>50                        selected#if>>100                        selected#if>>200                            条,共${page.getTotalCount()}条        
    
03627265d6d5a7e97b1daf15833bdcd6.gif

然后到Controller层:

fa1900c597082fbca00b65e87651bd29.gif
@RequestMapping(value = "/subjectInfors")    public ModelAndView subjectInfos()    {            ModelAndView mav = new ModelAndView(SubjectInforWebConstant.getSubjectInforListView());                try {                        Page page = new Page<>(PageUtil.PAGE_SIZE);            int[] pageParams = PageUtil.init(page,request);//分页初始化            subjectInforService.getSubjectInforsPages(page, pageParams);                        mav.addObject(MainWebConstant.getPage(), page);                    } catch (Exception e) {            e.printStackTrace();        }                return mav;    }
193a9573bac62a587f791e7581d93e15.gif

调用Service层:

9f8dbf62100a9368f25cca2686200dd5.gif
@Override    public List getSubjectInforsPages(Page page, int[] pageParams)    {        List results = new ArrayList<>();        StringBuffer resultsHQL = new StringBuffer(All_SUBJECT_INFORS);                try        {            results = subjectInforDAO.findByPage(resultsHQL.toString(), pageParams[0], pageParams[1]);                        page.setTotalCount(subjectInforDAO.getCount(resultsHQL.toString()));            page.setResult(results);                    } catch (Exception e)        {            e.printStackTrace();        }                return results;    }
224998ee8f42f8be11e5a04484dcd4e0.gif

调用DAO层:

a4a0301191f4ab2a4668a44ea15aeae6.gif
   /**     * find entity-s of database by hql     * --------------------------------------------------------     * @param(String)     hql                 * @param(String)     offset        当前标识         * @param(String)     pageSize    分页大小     * @return            null/List     */    @SuppressWarnings("unchecked")    public List findByPage(String hql, int offset, int pageSize)     {        if (hql == null)         {            return new ArrayList();        }        Query query = createQuery(hql);        if (!(offset == 0 && pageSize == 0))         {            query.setFirstResult(offset).setMaxResults(pageSize);        }        if (query.list() != null)            return query.list();        else            return null;    }
b7473a6f3be9da317e63f48018d5bf47.gif

实现的效果图:

729481826e8023b4572212704314ada9.png

这样分页就简简单单实现了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值