MySql 分页

来源:互联网 发布:怎么和淘宝客服联系 编辑:程序博客网 时间:2024/06/05 19:34
MySql 分页

 

由于最近项目需要,于是就简单写了个分页查询。总体而言MySql 分页机制较为简单。数据库方面只需要使用limit即可实现分页。前后台交互就直接用session传了值。

下面就写写具体的实现过程:

首先,创建一个Page VO类

  其中,总记录数可由数据库查得、每页默认记录数由你自己设定;

  总页数由总记录数及每页默认记录数获取,当然得有一个条件判断;

  当前页数由当前记录数及每页默认记录数获取,当然这也得有一个条件判断;

  当前记录条数可由页面传值同时配合每页默认记录数获取。

 1 package com.ctrl.vo; 2  3 public class Page { 4     private int totalPage;// 总页数 5     private int currentPage;// 当前页 6     private int totalRecord;// 总记录数 7     private int currentRecord=0;// 当前记录条数 8     private int pageSize = 10;// 每页默认记录数 9 10     public int getTotalPage() {11         return totalPage;12     }13 14     public void setTotalPage(int totalRecord, int pageSize) {15         if (totalRecord % pageSize == 0)16             this.totalPage = totalRecord / pageSize;17         else18             this.totalPage = totalRecord / pageSize + 1;19     }20 21     public int getCurrentPage() {22         return currentPage;23     }24 25     public void setCurrentPage(int currentRecord, int pageSize) {26         if (currentRecord % pageSize == 0)27             this.currentPage = currentRecord / pageSize;28         else29             this.currentPage = currentRecord / pageSize + 1;30     }31 32     public int getTotalRecord() {33         return totalRecord;34     }35 36     public void setTotalRecord(int totalRecord) {37         this.totalRecord = totalRecord;38     }39 40     public int getCurrentRecord() {41         return currentRecord;42     }43 44     public void setCurrentRecord(int currentRecord) {45         this.currentRecord = currentRecord;46     }47 48     @Override49     public String toString() {50         return "Page [totalPage=" + totalPage + ", currentPage=" + currentPage51                 + ", totalRecord=" + totalRecord + ", currentRecord="52                 + currentRecord + ", pageSize=" + pageSize + "]";53     }54 55     public int getPageSize() {56         return pageSize;57     }58 59     public void setPageSize(int pageSize) {60         this.pageSize = pageSize;61     }62     63 }

其次,showUsers.jsp页面(有省略,且部分名修改)

<c:choose>            <c:when test="${users != null }">                <br>                <form action="#" method="post">                    <table class="table table-striped table-bordered">                        <thead>                            <tr>                                <td>ID</td>                                <td>NAME</td>                                <td>CODE</td>                                <td>PWD</td>                                <td>STATE</td>                                <td>FLAG</td>                                <td>Update</td>                            </tr>                        </thead>                        <c:forEach items="${users }" var="user">                            <tr>                                <td>${user.id }</td>                                <td>${user.name }</td>                                <td>${user.code }</td>                                <td>${user.pwd }</td>                                <td>${user.state }</td>                                <td>${user.flag }</td>                                <td><a href="update.jsp?user=${user }">update</a></td>                            </tr>                        </c:forEach>                    </table>                </form>                <c:if test="${flag=='T'}">                    <a                        href="<%=request.getContextPath()%>/showLimitUsers?currentRecord=${page.currentRecord}&type=prev">前一页</a>                    /<a                        href="<%=request.getContextPath()%>/showLimitUsers?currentRecord=${page.currentRecord}&type=next"> 后一页</a>                </c:if>
.....

对于,servlet后台(SERVICE、DAO层代码省略...)

        Page page = new Page();        UserService userService = new UserServiceImpl();        //去掉管理员        long totalRecord = userService.getUsersCount() - 1;        page.setTotalRecord((int) totalRecord);        page.setTotalPage(page.getTotalRecord(), page.getPageSize());        String type = request.getParameter("type");        if (request.getParameter("currentRecord") != null                && !request.getParameter("currentRecord").equals("")) {            int currentRecord = Integer.parseInt(request                    .getParameter("currentRecord"));            page.setCurrentRecord(currentRecord);            page.setCurrentPage(page.getCurrentRecord(), page.getPageSize());            if ("next".equals(type)                    && page.getCurrentPage() < (page.getTotalPage() - 1)) {                currentRecord = currentRecord + 10;                page.setCurrentRecord(currentRecord);            } else if ("prev".equals(type) && page.getCurrentPage() > 0) {                currentRecord = currentRecord - 10;                page.setCurrentRecord(currentRecord);            }        } else {            page.setCurrentRecord(0);        }        List<User> users = userService.getLimitUsers(page.getCurrentRecord(),                page.getPageSize());        page.setCurrentPage(page.getCurrentRecord(), page.getPageSize());        HttpSession session = request.getSession();        //<a>标签是否显示        session.setAttribute("flag", "T");        session.setAttribute("users", users);        session.setAttribute("page", page);        response.sendRedirect(request.getContextPath() + "/showUsers.jsp");

当用户点击了next,当前记录数就加pageSize,prev则减去pageSize。同时当前页也需要与总页数之间进行比较,以防超越了页数范围。

由于未将所有功能均设置分页,故设定flag标志,当页面其他功能不需要分页的话,可以将分页<a>消除。

 

效果图:

PS:文中Page VO为借鉴而来。

心得:

  分页不难,但还是会出现bug,需要好好调试。可以通过打印Page&将所传的值在input标签显示方便调试。

0 0
原创粉丝点击