分页查询工具类

本文介绍了一种基于Java的分页查询实现方案,利用自定义PageUtil类进行封装,包括了总页数、当前页码等关键信息,并通过DAO层的具体实现展示了如何进行数据库分页查询,最终在JSP页面上展示查询结果。
package com.etc.util;

import java.util.List;

public class PageUtil<T> {
    //具体分页所用的对象组成的集合
    private List<T> list;
    //可分的最大页数
    private int maxPages;
    //总记录条数
    private int totalRecords;
    //每页显示的记录条数
    private int pageRecords=5;
    //要查询的页码
    private int pageIndex;
    //上一页的页码
    private int lastPageIndex;
    //下一页的页码
    private int nextPageIndex;

    /**
     * 当前页码
     * @return
     */
    public int getPageIndex() {
       return this.pageIndex;
    }
    /**
     * 当前页码
     * @return
     */
    public void setPageIndex(int pageIndex) {
         if(pageIndex <= 1) {
             this.pageIndex = 1;
             return;
       }
       this.pageIndex = pageIndex;
    }
    /**
     * 每页记录条数
     * @return
     */
    public int getPageRecords() {
        return pageRecords;
    }
    /**
     * 每页记录条数
     * @return
     */
    public void setPageRecords(int pageRecords) {
        this.pageRecords = pageRecords;
    }
    /**
     * 每页的记录数据
     * @return
     */
    public List<T> getList() {
        return list;
    }
    /**
     * 每页的记录数据
     * @return
     */
    public void setList(List<T> list) {
        this.list = list;
    }
    /**
     * 总页数
     * @return
     */
    public int getMaxPages() {
        setMaxPages();
        return maxPages;
    }
    /**
     * 总页数
     * @return
     */
    public void setMaxPages() {
        if (totalRecords % pageRecords == 0) {
            maxPages = totalRecords / pageRecords;
      } else {
          maxPages = totalRecords / pageRecords + 1;
      }
    }
    /**
     * 总记录条数
     * @return
     */
    public int getTotalRecords() {
        return totalRecords;
    }
    /**
     * 总记录条数
     * @return
     */
    public void setTotalRecords(int totalRecords) {
        this.totalRecords = totalRecords;
    }

     /**
     * 得到上一页码
     */
    public int getLastPageIndex() {
        pageIndex = getPageIndex(); // 得到当前页码
          if (pageIndex <=1) {
                return 1;
          }
          return pageIndex - 1;
    }
    public void setLastPageIndex() {
        lastPageIndex=getLastPageIndex();
    }
    /**
     * 得到下一页码
     */
    public int getNextPageIndex() {
        pageIndex = getPageIndex(); // 得到当前页码
        maxPages = getMaxPages(); // 得到最大页码数
          if (pageIndex >= maxPages) {
                return maxPages;
          }
          return pageIndex + 1;
    }
    public void setNextPageIndex() {
        nextPageIndex=getNextPageIndex();
    }

}

理解:在dao实现类里写一个方法,该方法需要传入的形参为要查询的页码、每页指定条数,通过自定义分页工具类PageUtil进行对象的封装,以便在jsp页码进行调用,实现必要的功能。PageUtil里的5个成员变量都是必要的:
list里面封装的是查询指定页码的指定个数的对象,在Jsp用表达式进行遍历显示
maxPages可用于选择最后一页
totalRecords也可用于显示总条数
pageRecords用于计算页数
pageIndex可用于上一页下一页的显示

以下为dao实现类里的分页的方法:

    @Override
    public PageUtil<Student> queryPage(int index, int pageRecords) {
        Statement st = null;
        ResultSet rs = null;
        ResultSet rsPage = null;
        List<Student> list = new ArrayList<Student>();
        int totalRecords = 0;
        PageUtil<Student> page = new PageUtil<Student>();
        Connection conn = BaseDao.getConn();
        // 查询总记录数目
        String sql = "select count(1) from student";
        try {
            st = conn.createStatement();
            rs = st.executeQuery(sql);
            rs.next();
            totalRecords = rs.getInt(1);
            page.setTotalRecords(totalRecords);
            rs.close();
            st.close();
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
        // 总页数
        page.setMaxPages((int) Math.ceil((double) totalRecords / pageRecords));
        // 当前页数保存在对象
        page.setPageIndex(index);
        // 指定页码的数据
        String sqlPage = "select * from student s INNER JOIN grade g where s.gradeId=g.gradeId ORDER BY studentNo limit ?,?";
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(sqlPage);
            ps.setObject(1, pageRecords * (index - 1));
            ps.setObject(2, pageRecords);
            rsPage = ps.executeQuery();
            while (rsPage.next()) {
                Student stu = new Student();
                stu.setAddress(rsPage.getString("address"));
                stu.setAge(rsPage.getInt("age"));
                stu.setBirthday(rsPage.getDate("birthday"));
                stu.setEmail(rsPage.getString("email"));
                stu.setGrade(new Grade(rsPage.getInt("gradeId"), rsPage.getString("gradeName")));
                stu.setPhone(rsPage.getString("phone"));
                stu.setSex(rsPage.getString("sex"));
                stu.setStudentNo(rsPage.getInt("studentNo"));
                stu.setName(rsPage.getString("name"));
                list.add(stu);
            }
            page.setList(list);
            return page;
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally {
            BaseDao.closeAll(conn, ps, rsPage);
        }
        return null;

    }

以下为jsp页面功能实现,pageUtil为封装过数据的PageUtil的对象:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set var="base" value="${pageContext.request.contextPath}"></c:set>
<table cellspacing="0">
        <tr>
            <th>编号</th>
            <th>姓名</th>
            <th>性别</th>
            <th>年龄</th>
            <th>电话</th>
            <th>地址</th>
            <th>邮箱</th>
            <th>生日</th>
            <th>年级</th>
        </tr>
        <c:forEach items="${pageUtil.list}" var="stu">
            <tr>
                <td>${stu.grade.gradeId }</td>
                <td>${stu.name }</td>
                <td>${stu.sex }</td>
                <td>${stu.age }</td>
                <td>${stu.phone }</td>
                <td>${stu.address }</td>
                <td>${stu.email }</td>
                <td>${stu.birthday }</td>
                <td>${stu.grade.gradeName}</td>
            </tr>
        </c:forEach>
    </table>
    一共${pageUtil.maxPages }页,当前为第 ${pageUtil.pageIndex }页

    <a href="${base}/studentSer?index=1">第一页</a>
    <a href="${base}/studentSer?index=${pageUtil.pageIndex>1?pageUtil.pageIndex-1:1}">上一页</a>

    <c:forEach begin="1" end="${pageUtil.maxPages}" var="i">
        <a href="${base}/studentSer?index=${i}">${i}</a>
    </c:forEach>
    <a href="${base}/studentSer?index=${pageUtil.pageIndex<pageUtil.maxPages?pageUtil.pageIndex+1:pageUtil.maxPages}">下一页</a>
    <a href="${base}/studentSer?index=${ pageUtil.maxPages}">最后一页</a>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值