mybatis的分页操作

之前一直都是自己直接抄别人的分页代码,抄完能运行但是感觉不甚了解,今天我结合网上的方法重新改造了一番,觉得更加好用了,下面就来分享一下。

其实分页原理很简单,数据库分页如果不考虑条件查询的话就需要两个参数,参数一:从第几条数据考试取,参数二:取到第几条数据,有了这两个参数,我们就能做绝大部分的分页,剩下的,就是要对应页面的分页栏通过分页逻辑生成后台需要的两个参数了
那么先开始看sql server上的分页查询语句:

<!-- 根据条件查询所有用户信息进行分页 -->
  <select id="selectAllByExmpleWithPage" resultMap="BaseResultMap" parameterType="map">
    select top ${pageRowNum} 
    <if test="distinct" >
      distinct
    </if>
    <include refid="Base_Column_List" />
    from user_Info 
    where id not in 
            (select top ${start} id from user_Info
            <where>
                <trim prefixOverrides="and">
                    <if test="UserName!=null">
                        and UserName like '%${UserName}%'
                    </if>
                    <if test="UserCode">
                        and UserCode like '%${UserCode}%'
                    </if>
                </trim>
            </where>
             order by id)
            <trim>
                <if test="UserName!=null">
                    and UserName like '%${UserName}%'
                </if>
                <if test="UserCode">
                    and UserCode like '%${UserCode}%'
                </if>
            </trim>
            order by id 
  </select>

接下来我们看看我的分页逻辑
有两个java类,一个是用来保存分页的数据的叫pagebean,它是用来跟页面进行信息交换的,里面定义了关于分页的参数。第二个java类是pageinfo,这个类是用来处理分页逻辑的,并把处理好的分页参数赋给pagebean。那么我们来看看这两个java类的代码:

package com.mjtrade.entity;


public class PageBean {
    private int pageNo;//当前页码
    private boolean firstPage;//是否是第一页
    private boolean lastPage;//是否是最后一页
    private int sumPage;//总的页数
    private int pageSize;//每页展示的数量
    private int totalResult;//总记录条数
    public int getPageNo() {
        return pageNo;
    }
    public void setPageNo(int pageNo) {
        this.pageNo = pageNo;
    }
    public boolean isFirstPage() {
        return firstPage;
    }
    public void setFirstPage(boolean firstPage) {
        this.firstPage = firstPage;
    }
    public boolean isLastPage() {
        return lastPage;
    }
    public void setLastPage(boolean lastPage) {
        this.lastPage = lastPage;
    }
    public int getSumPage() {
        return sumPage;
    }
    public void setSumPage(int sumPage) {
        this.sumPage = sumPage;
    }
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public int getTotalResult() {
        return totalResult;
    }
    public void setTotalResult(int totalResult) {
        this.totalResult = totalResult;
    }
    @Override
    public String toString() {
        return "PageBean [pageNo=" + pageNo + ", firstPage=" + firstPage
                + ", lastPage=" + lastPage + ", sumPage=" + sumPage
                + ", pageSize=" + pageSize + ", totalResult=" + totalResult
                + "]";
    }


}

另外一个处理逻辑的分类pageinfo

package com.mjtrade.entity;

import javax.servlet.http.HttpServletRequest;


/**
 * 用来计算分页的java类
 * @author ljl
 *
 */
public class PageInfo {
    //http请求
    private HttpServletRequest req;
    //每页的记录数
    private int pageSize=50;
    //当前页
    private int currentPageNo=1;
    //开始记录数
    private int beginResult=0;
    //总记录数
    private int totalResult=0;
    //总页数
    private int totalPage=0;

    private PageBean page=null;

    /**
     * 初始化http请求
     */
    public PageInfo(HttpServletRequest req){
        this.currentPageNo=req.getParameter("pageNO")!=null && !req.getParameter("pageNO").equals("")?new Integer(req.getParameter("pageNO")).intValue():1;
        //this.pageSize = req.getParameter("pagesize")!=null && !req.getParameter("pagesize").equals("")?new Integer(req.getParameter("pagesize")).intValue():50;
        if(this.pageSize<=0){

               this.pageSize=50;

           }
           this.req = req; 
    }
    public PageInfo(){
        this.currentPageNo=1;
        this.pageSize=50;

    }
    public PageInfo(int currentPageNo){

        this.currentPageNo=currentPageNo;
        this.pageSize=50;

    }
    /**
     * 计算总页数
     */
    private void countPages() {
        if(totalResult==0) {
            this.totalPage=1;
        }
        else {
            this.totalPage = (totalResult / pageSize); //总共几页
            if ((totalResult % pageSize) != 0) this.totalPage = this.totalPage + 1;
        }
    }
    public boolean isFirstPage(){

            if(this.currentPageNo<=1){

                return true;
            }else
            {
                return false;   
            }   
        }
    public boolean isLastPage(){

            if(this.currentPageNo>=this.totalPage){

                return true;
            }else
            {
                return false;   
            }   
        }
    /**
     * 获得当前页
     * @return int 当前页
     */
    public int getCurrentPageNo() {
          return currentPageNo;
    }
    /**
     * 获得每页的记录数
     * @return int
     */
    public int getPageSize() {
        return pageSize;
    }
    /**
     * 获得总记录数
     * @return int
     */
    public int getTotalResult() {
        return totalResult;
    }
    /**
     * 设置当前页
     * @param current int 当前页码
     */
    public void setCurrentPageNo(int current) {
        this.currentPageNo  =current;
    }
    /**
     * 设置每页的记录数
     * @param i int 记录数
     */
    public void setPageSize(int i) {
        this.pageSize = i;
    }
    /**
     * 获得开始记录数
     * @return int 开始记录数
     */
    public int getBeginResult() {
        if(totalPage!=1)
        {   if(currentPageNo>=totalPage){
                 currentPageNo=totalPage;
                 beginResult= (currentPageNo - 1) * pageSize;
                 pageSize=totalResult-beginResult;
            }else{

                beginResult = (currentPageNo - 1) * pageSize;

            }
        }
        if(totalPage==1)
        {
            currentPageNo=totalPage;

            beginResult=0;
            pageSize=totalResult;

        }
        setRequestValue();   
        return beginResult;
    }

    public void setBeginResult(int i) {
        this.beginResult = i;
    }
    /**
     * 获得总页数
     * @return int 总页数
     */
    public int getTotalPage() {

        //log.info("run here totalPage:"+totalPage);
        return totalPage;

    }
    public void setTotalResult(int totalResult) {
        this.totalResult = totalResult;
        countPages();
    }
    /**
     * 设置序号
     */
    private void setRequestValue(){     
        page=new PageBean();
        page.setFirstPage(isFirstPage());
        page.setLastPage(isLastPage());         
        page.setPageNo(currentPageNo);  
        page.setPageSize(pageSize);
        page.setSumPage(totalPage);
        page.setTotalResult(totalResult);

    }
    public PageBean getPageBean(){
        return page;

    }
    public void setTotalPage(int totalPage){

        this.totalPage=totalPage;
    }
    @Override
    public String toString() {
        return "PageInfo [req=" + req + ", pageSize=" + pageSize
                + ", currentPageNo=" + currentPageNo + ", beginResult="
                + beginResult + ", totalResult=" + totalResult + ", totalPage="
                + totalPage + ", page=" + page
                + "]";
    }
}

数据库查询,分页类,分页逻辑类都齐全了,下面就是jsp页面的分页代码了:

<form id="from1" action="${pageContext.request.contextPath }/toUserInfoList.do" method="get">
    <table border="0" width="70%" cellspacing="0" cellpadding="0">
        <%PageBean pagebean=(PageBean)request.getAttribute("pageBean"); %>
        <tr>
            </td>
            <td width="15%" align="left">总记录数:<%=pagebean.getTotalResult() %>条
            </td>
            <td width="14%" align="right"></td>
            <%if(pagebean.isFirstPage()){ %>
            <td width="8%" align="center">首页&nbsp;&nbsp;|</td>
            <td width="10%" align="center">上一页&nbsp;&nbsp;&nbsp;|</td>
            <%}else{ %>
            <td width="8%" align="center"><u><a href="#"
                    onClick="gotopage('changePage.do','start')">首页&nbsp;&nbsp;|</a></u></td>
            <td width="10%" align="center"><u><a href="#"
                    onClick="gotopage('changePage.do','prev')">上一页&nbsp;&nbsp;&nbsp;|</a></u></td>
            <%} %>
            <%if(pagebean.isLastPage()){ %>
            <td width="10%" align="center">下一页&nbsp;&nbsp;&nbsp;|</td>
            <td width="8%" align="center">末页</td>
            <%}else{ %>
            <td width="10%" align="center"><u><a href="#"
                    onClick="gotopage('changePage.do','next')">下一页&nbsp;&nbsp;&nbsp;|</a></u></td>
            <td width="8%" align="center"><u><a href="#"
                    onClick="gotopage('changePage.do','end')">末页</a></u></td>
            <%} %>
            <td width="6%" align="center">第<%=pagebean.getPageNo() %>页
            </td>
            <td width="6%" align="center">共<%=pagebean.getSumPage() %>页
            </td>
            <td width="21%" align="right">至第<input size="1" type="text"
                name="goPage" id="goPage">页<u><a href="#"
                    onClick="gotopage('changePage.do','go')">确定</a></u></td>

            <td><input id="pageNO" type="hidden" name="pageNO"
                value="<%=pagebean.getPageNo()%>"></td>
            <td><input id="prevpageNO" type="hidden" name="prevpageNO"
                value="<%=(pagebean.getPageNo()-1)%>"></td>
            <td><input id="nextpageNO" type="hidden" name="nextpageNO"
                value="<%=(pagebean.getPageNo()+1)%>"></td>
            <td><input id="sumPage" type="hidden" name="sumPage"
                value="<%=pagebean.getSumPage() %>"></td>
            <td><input id="pageSize" type="hidden" name="pageSize" value=""></td>
            <td><input id="initflag" type="hidden" name="initflag" value="1"> </td>
        </tr>
    </table>
    </form>

那分页的代码获取当前分页状态并且能够把点击的效果通过javainfo的逻辑处理赋给javabean的呢,是要通过js来处理,下面来看看页面引进js的代码:

<script type="text/javascript" src="${pageContext.request.contextPath }/js/page.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/validate.js"></script>

page.js:

/**
path:路径
where:分页处理,跳转的形式
*/
function  gotopage(path,where){
       var page=document.getElementById("pageNO").value; //当前页
       if(where=="next"){ //下一页
          page=document.getElementById("nextpageNO").value; 
       }else if(where=="prev"){ //上一页
          page=document.getElementById("prevpageNO").value;
       }else if(where=="end"){ //最后一页
          page=document.getElementById("sumPage").value;
       }else if(where=="start"){ //首页
          page=1;
       }else if(where=="go"){ //跳转到第几页
         if(Trim(document.getElementById("goPage").value)=="")
         {
             alert("请输入页数"); 
             document.getElementById("goPage").focus();   
             return false;
         }
         if(!checkNumber( document.getElementById("goPage")))
         {
             alert("请输入正确页数(数字)"); 
             document.getElementById("goPage").focus();       
             return false;
         }

         var objgo=parseInt(document.getElementById("goPage").value);
         var objsum=parseInt(document.getElementById("sumPage").value);
         if(objgo<=0||objgo>objsum){
             alert("不存在此页,请重新输入页数"); 
             document.getElementById("goPage").focus();      
             return false; 
         }
         page=document.getElementById("goPage").value;            
      } 
         document.getElementById("pageNO").value=page;
       document.getElementById("from1").submit(); 

  }

最后我们来看看后台是怎么通过获取javainfo的分页参数并且把两个最重要的参数传到数据库查询语句:

@RequestMapping("toUserInfoList.do")
    public String toUserInfoList(HttpServletRequest request){
            PageInfo info=new PageInfo(request);
            int totalResult=0;
            totalResult=userInfoService.queryCountofUserInfoByExample(null);
            info.setTotalResult(totalResult);
            //设置分页参数beginResult:从第几条开始取pageSize:一共要取几条记录
            //[输入参数]:int start:开始,int pageRowNum:每页数据量,Map<String, String> maps查询条件
            int beginResult=info.getBeginResult();
            int pageSize=info.getPageSize();
            Map<String, Object> maps=new HashMap<String, Object>();
            maps.put("start", beginResult);
            maps.put("pageRowNum", pageSize);
            maps.put("UserName", "1");
            //从数据库中取出相应数据
            List<UserInfo> infos= userInfoService.queryAllUserInfoWithPage(maps);
            request.setAttribute("infos", infos);
            PageBean bean=info.getPageBean();
            request.setAttribute("pageBean", bean);

        return "forward:/page1.jsp";
    }

其实分页一点也不难,只要理解好里面的关系就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值