You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为JSP动态数据库表格添加分页(每页最多5条)

实现Oracle数据表格的分页功能(每页5条)

我来帮你搞定这个分页需求!针对你的JSP+Oracle场景,咱们可以用Oracle原生的分页语法来实现,同时在页面上添加分页导航控件,下面是具体的实现步骤和修改后的代码:

核心思路

  • 获取当前页码和每页固定显示5条的参数
  • 修改Oracle查询语句,只查询当前页需要的5条数据
  • 计算总记录数,用于生成分页导航(比如总页数、上/下一页按钮)
  • 在页面底部添加直观的分页导航控件

具体代码修改

1. 先处理分页参数

在JSP开头添加分页参数的获取与初始化逻辑:

<%
// 分页配置:每页5条,默认显示第一页
int pageSize = 5;
int pageNo = 1;
String pageParam = request.getParameter("pageNo");
if(pageParam != null && !pageParam.isEmpty()){
    try{
        pageNo = Integer.parseInt(pageParam);
        // 页码不能小于1
        if(pageNo < 1) pageNo = 1;
    }catch(NumberFormatException e){
        pageNo = 1;
    }
}
// 计算Oracle分页需要的起始/结束行号
int startRow = (pageNo - 1) * pageSize + 1;
int endRow = pageNo * pageSize;
%>

2. 修改SQL查询(支持分页+避免SQL注入)

替换你原来的拼接式SQL,改用预编译语句+Oracle分页语法(兼容所有Oracle版本):

// 先写统计总记录数的SQL
String countSql = "SELECT COUNT(*) FROM (" + 
    "SELECT PK.PROJECT_ID,PK.PROJECT_NAME,PK.HEADER,PK.DESCRIPTION,DK.EMPLOYEE_ID,PK.approve " +
    "FROM EMPLOYEE_TASK PK INNER JOIN REGISTRATION_EMPLOYEE dk ON dk.employee_id=pk.employee_id " +
    "WHERE dk.REPORTING_MANAGER_ID=? AND PK.approve='Pending'" + 
") t";

// 分页查询的SQL(注意必须加排序,保证分页数据顺序稳定)
String pageSql = "SELECT * FROM (" +
    "SELECT t.*, ROWNUM rn FROM (" +
        "SELECT PK.PROJECT_ID,PK.PROJECT_NAME,PK.HEADER,PK.DESCRIPTION,DK.EMPLOYEE_ID,PK.approve " +
        "FROM EMPLOYEE_TASK PK INNER JOIN REGISTRATION_EMPLOYEE dk ON dk.employee_id=pk.employee_id " +
        "WHERE dk.REPORTING_MANAGER_ID=? AND PK.approve='Pending'" +
        "ORDER BY PK.PROJECT_ID" +
    ") t WHERE ROWNUM <= ?" +
") WHERE rn >= ?";

3. 执行查询并计算总页数

替换原来的statement查询逻辑,用PreparedStatement更安全:

// 统计总记录数,计算总页数
PreparedStatement countStmt = con.prepareStatement(countSql);
countStmt.setString(1, Manager_id);
ResultSet countRs = countStmt.executeQuery();
int totalRecords = 0;
if(countRs.next()){
    totalRecords = countRs.getInt(1);
}
// 计算总页数,向上取整
int totalPages = (totalRecords + pageSize - 1) / pageSize;

// 执行分页查询
PreparedStatement pageStmt = con.prepareStatement(pageSql);
pageStmt.setString(1, Manager_id);
pageStmt.setInt(2, endRow);
pageStmt.setInt(3, startRow);
resultSet2 = pageStmt.executeQuery();

4. 添加分页导航控件

在表格结束后添加分页按钮,方便切换页面:

<!-- 分页导航栏 -->
<div align="center" style="margin-top:15px; color:white;">
    <a href="?pageNo=1" style="margin:0 8px; color:yellow;">首页</a>
    <% if(pageNo > 1){ %>
        <a href="?pageNo=<%= pageNo - 1 %>" style="margin:0 8px; color:yellow;">上一页</a>
    <% } %>
    
    <!-- 显示页码按钮 -->
    <% for(int i=1; i<=totalPages; i++){ %>
        <% if(i == pageNo){ %>
            <span style="font-weight:bold; color:red; margin:0 8px;"><%= i %></span>
        <% }else{ %>
            <a href="?pageNo=<%= i %>" style="margin:0 8px; color:yellow;"><%= i %></a>
        <% } %>
    <% } %>
    
    <% if(pageNo < totalPages){ %>
        <a href="?pageNo=<%= pageNo + 1 %>" style="margin:0 8px; color:yellow;">下一页</a>
    <% } %>
    <a href="?pageNo=<%= totalPages %>" style="margin:0 8px; color:yellow;">尾页</a>
</div>

额外优化提示

  • Oracle 12c+简化写法:如果你的Oracle版本是12c及以上,可以用更简洁的分页语法替换上面的pageSql:
SELECT PK.PROJECT_ID,PK.PROJECT_NAME,PK.HEADER,PK.DESCRIPTION,DK.EMPLOYEE_ID,PK.approve 
FROM EMPLOYEE_TASK PK INNER JOIN REGISTRATION_EMPLOYEE dk ON dk.employee_id=pk.employee_id 
WHERE dk.REPORTING_MANAGER_ID=? AND PK.approve='Pending'
ORDER BY PK.PROJECT_ID
OFFSET <%= (pageNo-1)*pageSize %> ROWS FETCH NEXT <%= pageSize %> ROWS ONLY
  • SQL注入防护:你原来的代码直接把Manager_id拼进SQL里,存在安全风险,上面的代码用PreparedStatement绑定参数,一定要坚持这种写法!

这样修改后,你的页面就能实现每页5条记录的分页功能,经理可以通过分页按钮轻松切换不同页面查看数据啦!

内容的提问来源于stack exchange,提问作者Atul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:03:41