java分页栏总结_*Mybatis_PageHelper分页插件以及*原生的全部写法

1.插件写法

MyBatis 分页插件 - PageHelper

官网:https://gitee.com/free/Mybatis_PageHelper/
使用方法:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

首先导入Maven依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>最新版本</version>
</dependency>

在Mybatis的xml中导入 ,并修改<property name="properties">中的value改为helperDialect

<bean id="factoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <!-- 这是插件的配置 -->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <!-- 注意!"""""""使用下面的方式配置参数,一行配置一个 -->
                        <!--Dialect 是方言  mysql  使用limit 每种数据库不一样-->
                        <value>
                            helperDialect=mysql
                        </value>
                    </property>
                </bean>
            </array>
        </property>
    </bean>

分页插件参数介绍(需要详细了解的再看)

分页插件提供了多个可选参数,这些参数使用时,按照上面两种配置方式中的示例配置即可。

分页插件可选参数如下:

dialect:默认情况下会使用 PageHelper 方式进行分页,如果想要实现自己的分页逻辑,可以实现 Dialect(com.github.pagehelper.Dialect) 接口,然后配置该属性为实现类的全限定名称。
下面几个参数都是针对默认 dialect 情况下的参数。使用自定义 dialect 实现时,下面的参数没有任何作用。

helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:
oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。
你也可以实现 AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。

offsetAsPageNum:默认值为 false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。

rowBoundsWithCount:默认值为false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为true时,使用 RowBounds 分页会进行 count 查询。

pageSizeZero:默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。

reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。

params:为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。

supportMethodsArguments:支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest。

autoRuntimeDialect:默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择sqlserver2012,只能使用sqlserver),用法和注意事项参考下面的场景五。

closeConn:默认值为 true。当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接,默认true关闭,设置为 false 后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。

aggregateFunctions(5.1.5+):默认为所有常见数据库的聚合函数,允许手动添加聚合函数(影响行数),所有以聚合函数开头的函数,在进行 count 转换时,会套一层。其他函数和列会被替换为 count(0),其中count列可以自己配置。

重要提示:

当 offsetAsPageNum=false 的时候,由于 PageNum 问题,RowBounds查询的时候 reasonable 会强制为 false。使用 PageHelper.startPage 方法不受影响。

PageHelper.startPage 静态方法调用
还有一种的是侵入式调用RowBounds方式的调用,我们用第一种,原理是动态代理
在service使用

    @Override
    public PageInfo findAll(Integer page,Integer size) {
        //开始使用分页
        PageHelper.startPage(page,size);
        List<Company> all = companyDao.findAll();
        //使用pageInfo接受 Mybatis知道
        PageInfo pageInfo = new PageInfo(all);
        return pageInfo;
    }

在Contorller使用

 @RequestMapping(value = "/list",name = "显示所有公司列表")
    public String  list(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "5")Integer size){
        PageInfo all = companyService.findAll(page, size);
        request.setAttribute("page",all);
        return "company/company-list";
    }

前端分页栏
在这里插入图片描述
分页栏代码:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<div class="pull-left">
    <div class="form-group form-inline">
        总共${page.pages} 页,共${page.total} 条数据。
        <select id="selectSize" onchange="showSelection(this.options[this.options.selectedIndex].value)" class="form-control">
            <option  ${page.size eq 5 ? 'selected="selected"' : ""}>5</option>
            <option  ${page.size eq 10 ? 'selected="selected"' : ""}>10</option>
            <option  ${page.size eq 20 ? 'selected="selected"' : ""}>20</option>
            <option  ${page.size eq 40 ? 'selected="selected"' : ""}>40</option>
        </select></div>
</div>

<div class="box-tools pull-right">
    <ul class="pagination" style="margin: 0px;">
        <li >
            <a href="javascript:goPage(1)" aria-label="Previous">首页</a>
        </li>
        <li><a href="javascript:goPage(${page.prePage})">上一页</a></li>
        <c:forEach begin="${page.navigateFirstPage}" end="${page.navigateLastPage}" var="i">
            <li class="paginate_button ${page.pageNum==i ? 'active':''}"><a href="javascript:goPage(${i})">${i}</a></li>
        </c:forEach>
        <li><a href="javascript:goPage(${page.nextPage})">下一页</a></li>
        <li>
            <a href="javascript:goPage(${page.pages})" aria-label="Next">尾页</a>
        </li>
    </ul>
</div>
<form id="pageForm" action="${param.pageUrl}" method="post">
    <input type="hidden" name="page" id="pageNum">
     <input type="hidden" name="PageSize" id="pageSize"value="${page.pageSize}">
</form>
<script>
    function showSelection(selection){
        document.getElementById("pageSize").value=selection;
        goPage(1);
    }
    function goPage(page) {
        document.getElementById("pageNum").value = page
        var select=document.getElementById("selectSize")
        var selectValue=select.options[select.options.selectedIndex].value
        document.getElementById("pageSize").value = selectValue
        document.getElementById("pageForm").submit()
    }
</script>
</body>
</html>

将分页栏引入其他页面 并 传递表单action的 value

        <!-- .box-footer-->
        <div class="box-footer">
            <jsp:include page="../common/pageMybatis.jsp">
                <jsp:param name="pageUrl" value="${ctx}/system/dept/list.do" />
            </jsp:include>
        </div>

PageInfo属性介绍

public class PageInfo<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    //当前页
    private int pageNum;
    //每页的数量
    private int pageSize;
    //当前页的数量
    private int size;
    //由于startRow和endRow不常用,这里说个具体的用法
    //可以在页面中"显示startRow到endRow 共size条数据"
    //当前页面第一个元素在数据库中的行号
    private int startRow;
    //当前页面最后一个元素在数据库中的行号
    private int endRow;
    //总记录数
    private long total;
    //总页数
    private int pages;
    //结果集
    private List<T> list;

    //前一页
    private int prePage;
    //下一页
    private int nextPage;

    //是否为第一页
    private boolean isFirstPage = false;
    //是否为最后一页
    private boolean isLastPage = false;
    //是否有前一页
    private boolean hasPreviousPage = false;
    //是否有下一页
    private boolean hasNextPage = false;
    //导航页码数
    private int navigatePages;
    //所有导航页号
    private int[] navigatepageNums;
    //导航条上的第一页
    private int navigateFirstPage;
    //导航条上的最后一页
    private int navigateLastPage;

    public PageInfo() {
    }

2.原生写法

构建PageBean类

package com.czh.web.PageBean;

import java.util.List;

public class PageInfo {
    private Integer pageNumber;
    private Integer pageSize;
    private Integer startIndex;
    private Integer totalPages;
    private Long totalRecord;
    private List list;
    private Integer start;
    private Integer end;

    public PageInfo(Integer pageNumber,Integer pageSize,Long totalRecord,List list){
        this.totalRecord=totalRecord;
        this.totalPages = (int) (totalRecord%pageSize==0 ? (totalRecord/pageSize) : (totalRecord/pageSize+1));
        this.list = list;
        this.pageNumber=pageNumber;
        this.pageSize=pageSize;
        this.startIndex = (pageNumber - 1) * pageSize;
        jisuan();
    }

    @Override
    public String toString() {
        return "PageInfo{" +
                "pageNumber=" + pageNumber +
                ", pageSize=" + pageSize +
                ", startIndex=" + startIndex +
                ", totalPages=" + totalPages +
                ", totalRecord=" + totalRecord +
                ", list=" + list +
                ", start=" + start +
                ", end=" + end +
                '}';
    }

    public void  jisuan(){
        if(totalPages<10){
            start=1;
            end=totalPages;
        }else{
            if(pageNumber<=10){
                start=1;
                end=10;
            }else{
                if(pageNumber==totalPages){
                    end = totalPages;
                    start =totalPages-9;
                    return;
                }
                start=pageNumber-4;
                end=pageNumber+5;
            }
        }
    }

    public Integer getPageNumber() {
        return pageNumber;
    }

    public void setPageNumber(Integer pageNumber) {
        this.pageNumber = pageNumber;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getStartIndex() {
        return startIndex;
    }

    public void setStartIndex(Integer startIndex) {
        this.startIndex = startIndex;
    }

    public Integer getTotalPages() {
        return totalPages;
    }

    public void setTotalPages(Integer totalPages) {
        this.totalPages = totalPages;
    }

    public Long getTotalRecord() {
        return totalRecord;
    }

    public void setTotalRecord(Long totalRecord) {
        this.totalRecord = totalRecord;
    }

    public List getList() {
        return list;
    }

    public void setList(List list) {
        this.list = list;
    }

    public Integer getStart() {
        return start;
    }

    public void setStart(Integer start) {
        this.start = start;
    }

    public Integer getEnd() {
        return end;
    }

    public void setEnd(Integer end) {
        this.end = end;
    }
}

Contorller使用

  @RequestMapping(value = "/list",name = "根据公司id,查询部门列表")
    public String  list(@RequestParam(defaultValue = "1") String id,@RequestParam(defaultValue = "1") Integer PageNumber,@RequestParam(defaultValue = "5") Integer PageSize){
        System.out.println("页数:"+PageNumber);
        //设置totalRecord
        Long count=departmentService.findPageRecord(id);
        //分页查询数据
        List<Dept> all = departmentService.findPagelist(id,(PageNumber-1)*PageSize,PageSize);
        System.out.println(all);

        System.out.println("总数:"+count);
        PageInfo pageInfo = new PageInfo(PageNumber,PageSize,count,all);
        System.out.println(pageInfo);
        request.setAttribute("page",pageInfo);
        return "system/dept/dept-list";
    }

Service使用

 @Override
    public List<Dept> findPagelist(String companyId, Integer startIndex, Integer PageSize) {

        return departmentDao.findPagelist(companyId,startIndex,PageSize);
    }

前端page.jsp使用

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<div class="pull-left">
    <div class="pull-left">
        <div class="form-group form-inline">
            总共${page.totalPages} 页,共${page.totalRecord} 条数据。
            <select id="selectSize" onchange="showSelection(this.options[this.options.selectedIndex].value)" class="form-control">
                <option  ${page.pageSize eq 5 ? 'selected="selected"' : ""}>5</option>
                <option  ${page.pageSize eq 10 ? 'selected="selected"' : ""}>10</option>
                <option  ${page.pageSize eq 20 ? 'selected="selected"' : ""}>20</option>
                <option  ${page.pageSize eq 40 ? 'selected="selected"' : ""}>40</option>
            </select></div>
    </div>
</div>

<div class="box-tools pull-right">
    <ul class="pagination" style="margin: 0px;">
        <li >
            <a href="javascript:goPage(1)" aria-label="Previous">首页</a>
        </li>
        <li><a href="javascript:goPage(${page.pageNumber eq 1 ? 1 : page.pageNumber+1 })">上一页</a></li>
        <c:forEach begin="${page.start}" end="${page.end}" var="i">
            <li class="paginate_button ${page.pageNumber==i ? 'active':''}"><a href="javascript:goPage(${i})">${i}</a></li>
        </c:forEach>
        <li><a href="javascript:goPage(${page.pageNumber eq page.totalPages ? page.totalPages : page.pageNumber+ 1})">下一页</a></li>
        <li>
            <a href="javascript:goPage(${page.totalPages})" aria-label="Next">尾页</a>
        </li>
    </ul>
</div>

<form id="pageForm" action="${param.pageUrl}" method="post">
    <input type="hidden" name="PageNumber" id="pageNum">
    <input type="hidden" name="PageSize" id="pageSize"value="${page.pageSize}">
</form>
<script>
    function showSelection(selection){
        document.getElementById("pageSize").value=selection;
        goPage(1);
    }
    function goPage(page) {
        document.getElementById("pageNum").value = page
        var select=document.getElementById("selectSize")
        var selectValue=select.options[select.options.selectedIndex].value
        document.getElementById("pageSize").value = selectValue
        document.getElementById("pageForm").submit()
    }
</script>
</body>
</html>

在其他页面引入该页面 传递action的 value

      <div class="box-footer">
            <jsp:include page="../../common/page.jsp">
                <jsp:param name="pageUrl" value="${ctx}/system/dept/list.do" />
            </jsp:include>
        </div>

来自一位大佬的pageResult (仅供参考)

package cn.itcast.common.entity;

import java.io.Serializable;
import java.util.List;

/**
 * 分页结果类
 * @author Administrator
 *
 */
public class PageResult implements Serializable {

	private long total;//总记录数
	private List rows;//当前页记录
	private int page;
	private int size;
	private int totalPage;
	private int beg;
	private int end;
	private int pre;
	private int next;
	private static int DEFAULT_PAGE_RANGE=4;

	public PageResult(){}
		
	public PageResult(long total, List rows, int page, int size) {
		super();
		this.total = total;
		this.rows = rows;
		this.page = page;
		this.size = size;
		// 计算
        this.totalPage = (int) (total % size == 0 ? (total/size): (total/size+1));
		// 获取显示起始页码
        calcPage(page,totalPage,2);
        this.pre = page == 1 ? 1: page-1;
        this.next = page == totalPage ? totalPage:page+1;
	}

    public void calcPage(int pageNum,int pageCount,int sideNum){
        int startNum = 0;
        int endNum = 0;

        if(pageCount<=sideNum){
            endNum = pageCount;
        }else{
            if((sideNum+pageNum)>=pageCount){
                endNum = pageCount;
            }else{
                endNum = sideNum+pageNum;
                if((sideNum+pageNum)<=(2*sideNum+1)){
                    if((2*sideNum+1)>=pageCount){
                        endNum = pageCount;
                    }else{
                        endNum = 2*sideNum+1;
                    }
                }else{
                    endNum = sideNum + pageNum;
                }
            }
        }
        if(pageNum<=sideNum){
            startNum = 1;
        }else{
            if((pageNum+sideNum)>=pageCount){
                if((2*sideNum+1)>=pageCount){
                    if((pageCount - 2*sideNum)>=1){
                        startNum = pageCount - 2*sideNum;
                    }else{
                        startNum = 1;
                    }
                }else{
                    startNum = pageCount - 2*sideNum;
                }
            }else{
                if((pageNum-sideNum)>=1){
                    startNum = pageNum - sideNum;
                }else{
                    startNum = 1;
                }
            }
        }
        this.beg = startNum;
        this.end = endNum;
    }
	
	public long getTotal() {
		return total;
	}
	public void setTotal(long total) {
		this.total = total;
	}
	public List getRows() {
		return rows;
	}
	public void setRows(List rows) {
		this.rows = rows;
	}

    public int getPage() {
        return page;
    }

    public void setPage(int page) {
        this.page = page;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public int getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    public int getBeg() {
        return beg;
    }

    public void setBeg(int beg) {
        this.beg = beg;
    }

    public int getEnd() {
        return end;
    }

    public void setEnd(int end) {
        this.end = end;
    }

	public int getPre() {
		return pre;
	}

	public void setPre(int pre) {
		this.pre = pre;
	}

	public int getNext() {
		return next;
	}

	public void setNext(int next) {
		this.next = next;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值