JAVA EE之实现分页查询功能

涉及:mysql,bootstrap等

1:分页原理 

mysql数据库中分页查询的子句是limit

格式:limit a,b;

a 表示第一条记录的索引。从0开始

b 表示取几条记录。

每页5条记录。

第1页: limit 0,5

第2页: limit 5,5

第3页: limit 10,5

第n页: limit (n-1)*5 , 5

公式 : limit (页码-1*每页记录数量,每页记录数量

2: 创建一个PageVO类,用来封装分页查询的数据

分页查询数据:

1 page                   页码                   用户指定

2 recordOfPage    每页记录数量     用户指定

3 pageCount         总页数               计算得到

4 recordCount       总记录数量        select count(*)

5 list                      当前页的集合     select * from items limit

import java.util.List;

public class PageVO<T> {
    // 1 page 页码 用户指定
    private int page;
    // 2 recordOfPage 每页记录数量 用户指定
    private int recordOfPage;
    // 3 pageCount 总页数 计算得到
    private int pageCount;
    // 4 recordCount 总记录数量 select count(*)
    private int recordCount;
    // 5 list 当前页的集合 select * from items limit
    private List<T> list;
    
    // 6  生成get set

 3:编写分页查询使用的工具类 

public class SQLUtil {

    /**
     * 动态生成分页查询的Limit子句
     * @param page 当前页码
     * @param recordOfPage 每页记录数量
     * @re
     * turn limit子句(select id,username,password,email  from users limit 0,5)
     */
    public static String getLimit(int page, int recordOfPage) {
        return " limit " + ((page - 1) * recordOfPage) + "," + recordOfPage;
    }

4:编写DAO

我们要编写二个方法:

1 :countUsers      总记录数量      select count(*) from users

2: searchUsers    当前页的集合    select * from users limit

1:计算所有的用户数 (数据库的链接和关闭已经封装)

    /**
     * 计算所有用户数量
     * @return 用户总数
     * @throws Exception
     */
    public  int countUsers() {
        Connection conn =null;
        String sql = "select count(*) total from users";
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            conn=ConnectUtil.getConnection();
            stmt = conn.prepareStatement(sql);
            rs = stmt.executeQuery();
            while (rs.next()) {
                return rs.getInt("total");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectUtil.release(rs, stmt, conn);
        }
        return 0;
    }

2:当前页的集合

    /**
     * 分页查询用户
     * @param page 当前页
     * @param recordPage 一次查询多少用户
     * @return 返回一页查询的用户数量
     */
    public List<User> searchUsers(int page,int recordPage){
        Connection conn =null;
        List<User> users=new ArrayList<User>();
        String sql = "select id,username,password,email  from users "+SQLUtil.getLimit(page,recordPage);
        // select id,username,password,email  from users limit 0,5
        PreparedStatement stmt=null;
        ResultSet rs=null;
        try {
            conn=ConnectUtil.getConnection();
            stmt = conn.prepareStatement(sql);
            rs = stmt.executeQuery();
            while (rs.next()) {
                User user=new User();
               user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setEmail(rs.getString("email"));
                users.add(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectUtil.release(rs, stmt, conn);
        }
        return users;

    }

5:编写service

package com.fish.service;

import com.fish.dao.UserDao;
import com.fish.entity.User;
import com.fish.vo.PageVO;

import java.util.List;

public class UserService {

    private UserDao userDao;
    public UserService(){
        userDao=new UserDao();
    }

    
    /**
     * 后台分页查询用户
     * @param page 当前页
     * @param recordPage
     * @return
     */
    public PageVO<User> searchUsers(int page, int recordPage){
        // 用于封装分页的信息
        PageVO<User> pageVO=new PageVO<User>();
        //得到用户总数
        int userCount=userDao.countUsers();
        //计算总页数
        int pageCount=((userCount-1)/recordPage)+1;
        //当前页面控制
        if(page<1)page=1;
        if (page>pageCount)page=pageCount;
        //获取当前页的集合
        List<User> users=userDao.searchUsers(page,recordPage);

        //封装分页实体类(存,一个页面的用户,用户数,页数,等)
        pageVO.setPage(page);//当前页
        pageVO.setPageCount(pageCount);//总页数
        pageVO.setRecordCount(recordPage);//总记录数
        pageVO.setRecordOfPage(recordPage);//每页显示多少条
        pageVO.setList(users);//当前页的用户

        System.out.printf(pageVO.toString()+"------------------pageVo");
        return pageVO;
    }

}

6:编写Controller

@WebServlet("/manage/getUsers.do")
public class UsersServlet extends HttpServlet {
    private UserService userService;
    @Override
    public void init() throws ServletException {
        super.init();
        userService=new UserService();
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1 获取请求参数-分页
        int recordOfPage = 10;//每页10条记录
        int page = 1;//默认第一页
        if(req.getParameter("page")!=null){
            page = Integer.parseInt(req.getParameter("page"));
        }
        //2 调用业务逻辑
        PageVO<User> pageVO = userService.searchUsers(page,recordOfPage);//(里面封装的是用户分页信息)
        List<User> userList = pageVO.getList();
        //3 数据传递和页面导航
        if (userList!=null){
            req.setAttribute("userList", userList);//每页的用户
            req.setAttribute("pageVO", pageVO);//分页的信息
            req.getRequestDispatcher("/WEB-INF/views/usersShow.jsp").forward(req, resp);
        }else {
             req.getRequestDispatcher("/WEB-INF/views/error/404.jsp").forward(req,resp);
        }

    }


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

7: JSP(样式基于bootstrap)

<%--分页--%>
 <div class="row">
     <div class="col-lg-6 col-lg-offset-3" >
         <ul class="pagination">
             <c:choose>
                 <c:when test="${requestScope.pageVO.page eq 1}">
                     <li  class="disabled">
                         <a title="上一页" href="javascript:void(0);">
                             <span aria-hidden="true">&laquo;</span>
                         </a>
                     </li>
                 </c:when>
                 <c:otherwise>
                     <li>
                         <a title="上一页" href="javascript:doPage(${requestScope.pageVO.page - 1});">
                             <span aria-hidden="true">&laquo;</span>
                         </a>
                     </li>
                 </c:otherwise>
             </c:choose>

             <c:forEach begin="1" end="${requestScope.pageVO.pageCount }" var="index">
                 <c:choose>
                     <c:when test="${index eq requestScope.pageVO.page }">
                         <li class="active"><a  href="javascript:doPage(${index });">${index}</a></li>
                     </c:when>
                     <c:otherwise>
                         <li><a href="javascript:doPage(${index });">${index}</a></li>
                     </c:otherwise>
                 </c:choose>
             </c:forEach>

             <c:choose>
                 <c:when test="${requestScope.pageVO.page eq requestScope.pageVO.pageCount }">
                     <li  class="disabled">
                         <a title="下一页" href="javascript:void(0);">
                             <span aria-hidden="true">&raquo;</span>
                         </a>
                     </li>
                 </c:when>
                 <c:otherwise>
                     <li>
                         <a title="下一页" href="javascript:doPage(${requestScope.pageVO.page + 1});">
                             <span aria-hidden="true">&raquo;</span>
                         </a>
                     </li>
                 </c:otherwise>
             </c:choose>
         </ul>
     </div>
 </div>
<form action="/manage/getUsers.do" id="pageForm" method="post">
    <input type="hidden" id="page" name="page" value="1">
</form>
<%--分页end--%>
<script type="text/javascript">
    function doPage(n){
        document.getElementById("page").value=n;
        document.getElementById("pageForm").submit();
    }
</script>

8:效果图

JAVA EE之实现分页查询功能