当前位置: 首页 > article >正文

【Java Web】分页查询

分页查询

分页查询用于在处理大量数据时,将数据分成多个小部分(页)来展示。这样可以提高用户体验,减少单次加载的数据量,从而加快页面响应速度,并且降低服务器和数据库的负载。

基本概念

  • 页大小(Page Size):每一页显示的记录数量。
  • 当前页码(Current Page Number):用户正在查看的页码。
  • 总记录数(Total Record Count):数据库中满足条件的总记录数。
  • 总页数(Total Pages):基于总记录数和页大小计算得出的总页数。
  • 偏移量(Offset):从第一条记录开始到当前页的第一条记录之间的距离。
// 总记录数除以页大小(向上取整)得到总页数
int totalPages = (int) Math.ceil((double) totalRecords / pageSize);

基本步骤

升级示例5

在 DAO 层,获取总记录数,根据传入的偏移量(offset)和每页显示记录数(pageSize)来构建SQL查询语句。

// 修改公共接口全查方法,加入参数
public interface PublicInterface<E> {
    /**
     * 分页全查
     * @param offset 偏移量
     * @param pageSize 每页显示记录数
     * @return
     */
    List<E> findAll(Integer offset, Integer pageSize);
    /**
     * 获取总记录数
     * @return int
     */
    int findListCount();
}
// 添加 limit 条件
@Override
public List<SmbmsProvider> findAll(Integer offset, Integer pageSize) {
    ...
    String sql = "select id,proCode,proName,proDesc,creationDate " +
        "from smbms_provider order by creationDate desc limit ?,?";
    ResultSet res = query(sql,offset,pageSize);
    ...
}
@Override
public int findListCount() {
    try {
        int count = 0;
        if (getConnection()) {
            String sql = "select count(1) count from smbms_provider";
            ResultSet res =  query(sql,null);
            while(res.next()){
                count = res.getInt("count");
            }
        }
        return count;
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        closeResources(); // 释放资源
    }
    return 0;
}

在 Service 层,处理业务逻辑,包括根据当前页(pageNow)计算偏移量(offset)、根据总记录数(count)计算总页数(pageCount)。

public interface SmbmsProviderService {
    /**
     * 分页全查
     * @param pageNow 当前页
     * @param pageSize 每页显示记录数
     * @return
     */
    public List<SmbmsProvider> findAll(Integer pageNow, Integer pageSize);

    /**
     * 获得总页数
     * @return int
     */
    public int findListCount(Integer pageSize);
}
@Override
public List<SmbmsProvider> findAll(Integer pageNow, Integer pageSize) {
    int offset = (pageNow - 1) * pageSize;
    return smbmsProviderDao.findAll(offset, pageSize);
}

@Override
public int findListCount(Integer pageSize) {
    // 获取总记录数
    int count = smbmsProviderDao.findListCount();
    // 总页数 = 总记录数%每页显count示记录数==0?(总记录数/每页显示记录数):(总记录数/每页显示记录数)+1
    int pageCount = count % pageSize == 0 ? (count / pageSize) : (count / pageSize) + 1;
    return pageCount;
}

在 Servlet 中,接收前端请求参数获取当前页码,调用 Service 层的方法获取总页数(pageCount),处理当前页(pageNow),最后将这些信息设置到请求属性中转发给视图。

int pageCount; // 总页数
int pageSize = 5;  // 每页显示记录数
// 从请求参数中获取当前页码
int pageNow = 1;
if (request.getParameter("page") != null) {
    pageNow = Integer.parseInt(request.getParameter("page"));
}
// 调用 Java 方法 获取供应商列表信息
List<SmbmsProvider> providerList = smbmsProviderService.findAll(pageNow,pageSize);
// 获得总页数
pageCount = smbmsProviderService.findListCount(pageSize);

// 将数据和分页信息放入请求属性
request.setAttribute("providerList", providerList);
request.setAttribute("pageNow", pageNow);
request.setAttribute("pageCount", pageCount);

index.jsp 实现分页导航的功能

<div class="pagination">
    <a <c:if test="${pageNow == 1}">class="disabled"</c:if> <c:if test="${pageNow > 1}">href="/index?page=1"</c:if>>首页</a>
    <a <c:if test="${pageNow == 1}">class="disabled"</c:if> <c:if test="${pageNow > 1}">href="/index?page=${pageNow - 1}"</c:if>>上一页</a>

    <c:forEach begin="1" end="${pageCount}" var="i">
        <c:choose>
            <c:when test="${i == pageNow}">
                <a class="active">${i}</a>
            </c:when>
            <c:otherwise>
                <a href="/index?page=${i}">${i}</a>
            </c:otherwise>
        </c:choose>
    </c:forEach>

    <a <c:if test="${pageNow == pageCount}">class="disabled"</c:if> <c:if test="${pageNow < pageCount}">href="/index?page=${pageNow + 1}"</c:if>>下一页</a>
    <a <c:if test="${pageNow == pageCount}">class="disabled"</c:if> <c:if test="${pageNow < pageCount}">href="/index?page=${pageCount}"</c:if>>尾页</a>
    当前第 ${pageNow} / ${pageCount} 页
</div>

在这里插入图片描述


http://www.kler.cn/a/393117.html

相关文章:

  • iOS开发代码块-OC版
  • 2021-04-08 VSC++: 降序折半查找。
  • ffmpeg之播放一个yuv视频
  • 分别查询 user 表中 avatar 和 nickname 列为空的用户数量
  • 修改el-select下拉框高度;更新:支持动态修改
  • 【Object字段缺失】JS的对象在更新后发现Key值消失
  • 材质(二)——材质参数化,从源材质继承生成不同的材质实例
  • Lodash的常用方法整理
  • 上头:5个电脑必装的神级软件,一个比一个好用
  • lambdaQueryWrapper详细解释
  • 【菜笔cf刷题日常-1400】C. RationalLee(贪心)
  • 蓝桥杯每日真题 - 第11天
  • 轻松上手:使用Docker部署Java服务
  • openGauss常见问题与故障处理(四)
  • 量化交易系统开发-实时行情自动化交易-3.4.1.6.A股宏观经济数据
  • 边缘计算在工业互联网中的应用
  • SystemVerilog学习笔记(九):Schedule
  • Vue 生命周期函数
  • 可认证数据资产合约标准协议(CMIDA-1)意见征集
  • 06.VSCODE:备战大项目,CMake专项配置
  • PcVue + SQL Grid : 释放数据的无限潜力
  • 堆排序与链式二叉树:数据结构与排序算法的双重探索
  • 【STM32F1】——无线收发模块RF200与串口通信
  • 使用Java绘制图片边框,解决微信小程序map组件中marker与label层级关系问题,label增加外边框后显示不能置与marker上面
  • go reflect 反射
  • 若依笔记(八):芋道的Docker容器化部署