java分页实例
引言
在现代Web应用和移动应用中,面对大量数据的展示,分页技术成为了提升用户体验和优化数据加载效率的关键手段。尤其是在MySQL数据库环境中,合理运用分页查询不仅能显著减少服务器负载,还能提升数据访问速度,为用户提供流畅的浏览体验。本文将深入探讨分页的概念、实现原理,以及如何在MySQL中高效地执行分页查询,结合丰富的代码示例和实战技巧,帮助你掌握这一核心技能。
分页的基本概念和作用
分页是指将大数据集分割成一系列较小的数据块(即页面),每次仅加载其中一部分数据供用户查看。这种策略有效解决了一次性加载全部数据可能导致的性能瓶颈问题,同时也让用户能够更加轻松地管理和浏览数据。
页(Page)
数据分割后的独立单元,每页包含固定数量的数据条目(如 10 条、20 条)。
页码(Page Number)
标识当前显示的是第几页,通常从 1 开始计数。
每页数量(Page Size)
每页显示的数据条目数,如 page_size=10。
总页数(Total Pages)
基于总数据量和每页数量计算得出:总页数 = ceil(总数据量 / 每页数量)。
分页的作用
- 性能优化:减少单次查询的数据量,降低网络传输负担和数据库负载。
- 用户体验:提高页面加载速度,使用户操作更加流畅。
- 资源节约:避免不必要的数据传输和处理,节省带宽和计算资源。
分页实现原理
每次请求仅从数据库查询当前页的数据,通过 SQL 的 LIMIT 和 OFFSET 实现。
SELECT * FROM table ORDER BY id LIMIT 10 OFFSET 20; -- 第3页(每页10条)
优点:减少数据库和服务器的负载,适合大数据量。
缺点:频繁的数据库查询可能影响性能(尤其是 OFFSET 较大时)。
实例:
html页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="js/jquery-3.7.1.min.js"></script>
<script src="js/jquery.cookie.min.js"></script>
<script src="js/student.js" defer></script>
<style type='text/css'>.page{display:flex;margin-left:-40px;}.page li{list-style:none;border:1px solid #444;font-size:14px;padding:3px;cursor:pointer;margin-right:5px;}.page li.current{background:#444;color:#fff;}
</style>
</head>
<body><input type='button' value='添加' class='add'><table border ="1"><thead><tr><th>id</th><th>name</th><th>age</th><th>sex</th><th>操作</th></tr></thead><tbody></tbody></table><ul class='page'><!--<li>首页<><li>上一页<><li>1<><li>2<><li>3<><li>4<><li>下一页<><li>尾页<>--></ul></body>
</html>
js页面:
var page = 1
var pageSize = 6
//查找学生
var loadDate = function(){$.ajax({url:"SearchServlet1",type:"get",data:{page,pageSize},success:function(value){var arr = value.data$("tbody").empty()for(var i=0;i<arr.length;i++){$("tbody").append("<tr>"+"<td>"+arr[i].id+"</td>"+"<td>"+arr[i].name+"</td>"+"<td>"+arr[i].age+"</td>"+"<td>"+arr[i].sex+"</td>"+"<td><input type='button' value='修改' class='update' index='"+arr[i].id+"'><input type='button' value='删除' class='delete' index='"+arr[i].id+"'> </td>"+"</tr>")}},error:function(){alert("出错了")},})
}//加载页码
$.ajax({url:"GetCountServlet",type:"get",success:function(value){$(".page").append("<li class='first'>首页</li>")$(".page").append("<li class='prev'>上一页</li>")for(var i=0;i<Math.ceil(value.num/pageSize);i++){if(i==0){$(".page").append("<li class='current item'>"+(i+1)+"</li>")}else{$(".page").append("<li class='item'>"+(i+1)+"</li>")}}$(".page").append("<li class='next'>下一页</li>")$(".page").append("<li class='last'>尾页</li>")},error:function(){alert("错了")},
})//任意页码切换
$(".page").on("click",".item",function(){page=$(this).text()loadDate();$(this).addClass("current")$(this).siblings().removeClass("current")
})
//首页
$(".page").on("click",".first",function(){page=1loadDate();$(".item").removeClass("current")$(".item").first().addClass("current")
})
//尾页
$(".page").on("click",".last",function(){page=$(".this").lengthloadDate();$(".item").removeClass("current")$(".item").last().addClass("current")
})
//上一页切换
$(".page").on("click",".prev",function(){if(page==1){alert("没有前一页了")return}page--loadDate()$(".item").removeClass("current")$(".item").eq(page-1).addClass("current")
})//下一页切换
$(".page").on("click",".next",function(){if(page==$(".item").length){alert("没有下一页了")return}page++loadDate()$(".item").removeClass("current")$(".item").eq(page-1).addClass("current")
})
servlet代码:
package com.qcby.servlet;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.qcby.db.MysqlUtil;
/*** Servlet implementation class SearchServlet*/
@WebServlet("/SearchServlet1")
public class SearchServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public SearchServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String page = request.getParameter("page");String pageSize = request.getParameter("pageSize");String sql = "select * from student limit "+(Integer.parseInt(page)-1)*Integer.parseInt(pageSize)+","+pageSize;String[] colums = {"id","name","age","sex"};String res = MysqlUtil.getJsonBySql(sql, colums); response.setContentType("text/json;charset=utf-8");response.getWriter().write(res);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}}
package com.qcby.servlet;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.qcby.db.MysqlUtil;/*** Servlet implementation class GetCountServlet*/
@WebServlet("/GetCountServlet")
public class GetCountServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public GetCountServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String sql="select count(*) from rooms";int num=MysqlUtil.getCount(sql);String res="{\"num\":"+num+"}";response.setContentType("text/json;charset=utf-8");response.getWriter().write(res);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

笔记:
1. for(var i=0;i<Math.ceil(value.num/pageSize);i++)
主要功能是基于给定的总数量value.num与每页显示数量pageSize,算出所需的总页数,接着对这些页面进行遍历。Math.ceil() 是 JavaScript 中的一个内置函数,属于 Math 对象。它的作用是向上取整,即返回大于或等于给定数字的最小整数。
2. $(this).addClass("current")$(this).siblings().removeClass("current")
给当前页面添加class,其兄弟姐妹都不能使用这个类。方便样式添加。
3. $(".item").removeClass("current") $(".item").eq(page-1).addClass("current")
page是从1开始的,而eq(page - 1)此方法会从选中的元素集合里选取索引为 page - 1 的元素。在 jQuery 中,元素的索引是从 0 开始的,所以 page - 1 表示第 page 个元素(从 1 开始计数)。因为之前有++/--所以正好对应下一个元素。
4. String page = request.getParameter("page"); String pageSize = request.getParameter("pageSize"); String sql = "select * from student limit "+(Integer.parseInt(page)-1)*Integer.parseInt(pageSize)+","+pageSize;
主要功能是从 HTTP 请求里获取 page 和 pageSize 参数,然后构建一条 SQL 查询语句,以此实现数据的分页查询 。
Integer.parseInt() 是 Java 中的一个静态方法,它属于 java.lang.Integer 类。此方法的主要用途是将字符串类型的数字转换为 int 类型的整数。
相关文章:
java分页实例
引言 在现代Web应用和移动应用中,面对大量数据的展示,分页技术成为了提升用户体验和优化数据加载效率的关键手段。尤其是在MySQL数据库环境中,合理运用分页查询不仅能显著减少服务器负载,还能提升数据访问速度,为用户提…...
android 实现头像堆叠效果
1:依赖 implementation ("com.github.bumptech.glide:glide:4.12.0") annotationProcessor ("com.github.bumptech.glide:compiler:4.12.0") 第一种方式,布局创建frameLayout使用动态添加view方式实现 <FrameLayout and…...
【Linux篇】ELF文件及其加载与动态链接机制
ELF文件及其加载与动态链接机制 一. EFL文件1.1 ELF文件结构二. ELF文件形成与加载2.1 ELF形成可执行2.2 ELF控制性文件的加载2.2.1总结 三. ELF加载与进程地址空间3.1 动态链接与动态库加载3.1.1 进程如何看到动态库 3.2 全局偏移量表GOT(global offset table)3.2.…...
经典算法 判断一个图中是否有环
判断一个图中是否有环 问题描述 给一个以0 0结尾的整数对列表,除0 0外的每两个整数表示一条连接了这两个节点的边。假设节点编号不超过100000大于0。你只要判断由这些节点和边构成的图中是否存在环。存在输出YES,不存在输出NO。 输入样例1 6 8 5 3 …...
AI与深度伪造技术:如何识别和防范AI生成的假视频和假音频?
引言:深度伪造的崛起 近年来,人工智能技术迅猛发展,其中深度伪造(Deepfake) 技术尤为引人注目。这项技术利用深度学习和神经网络,可以轻松生成高度逼真的假视频和假音频,使人物的面部表情、语音…...
静态站点生成
以下是关于 静态站点生成(SSG) 的系统知识梳理,涵盖核心概念、核心实现、数据管理与优化等内容: 一、核心概念与优势 定义 静态站点生成(SSG)是在构建阶段预生成所有静态HTML文件的技术,用户访问时直接获取预渲染内容,无需服务器动态生成。 核心优势 性能卓越:CDN缓存…...
ESP32驱动读取ADXL345三轴加速度传感器实时数据
ESP32读取ADXL345三轴加速度传感器实时数据 ADXL345三轴加速度传感器简介ADXL345模块原理图与引脚说明ESP32读取ADXL345程序实验结果 ADXL345三轴加速度传感器简介 ADXL345是一款由Analog Devices公司推出的三轴数字加速度计,分辨率高(13位),测量范围达…...
【Linux】系统入门
【Linux】系统初识 起源开源 闭源版本内核内核编号 Linux的安装双系统(不推荐)WindowsLinuxvmware虚拟机vitualbox操作系统的镜像centos 7/ubuntu云服务器租用 Linux的操作lsmkdir 文件名pwdadduser userdel -rrm文件名cat /proc/cpuinfolinux支持编程vim code.c./a.out 运行程…...
关于Spring解决循环依赖的一些思考
Spring采用三级缓存解决循环依赖问题,当你尝试写一个简单的ioc容器时发现根本不需要三级缓存。那Spring为什么采用三级缓存呢? 文章目录 什么是循环依赖?手写一个简单的ioc容器Bean的创建流程Spring如何解决循环依赖?三级缓存Spri…...
github配置ssh,全程CV
1)随便找一个文件夹右键进入git bash 2)验证是否已有公私钥文件 cd ~/.ssh ls如果不存在则生成然后获取 生成时一直回车 ssh-keygen -t rsa -C "xxxxxx.com" cd ~/.ssh cat id_rsa.pub如果存在则直接获取 cd ~/.ssh cat id_rsa.pub3)复制 4…...
Dify简介:从架构到部署与应用解析
Dify 是一个开源的生成式 AI 应用开发平台,融合了后端即服务(Backend as a Service, BaaS)和 LLMOps 的理念,旨在帮助开发者快速搭建生产级的生成式 AI 应用。本文将详细解析 Dify 的技术架构、部署流程以及实际应用场景ÿ…...
构建高可靠C++服务框架:从日志系统到任务调度器的完整实现
构建高可靠C服务框架:从日志系统到任务调度器的完整实现 一、深度解析示例代码技术体系 1.1 日志系统的进阶应用 示例代码中的ZRY_LOG_XXX宏展示了基础日志功能,但在生产环境中我们需要更完善的日志系统: 推荐技术栈组合: sp…...
碳化硅(SiC)功率模块方案对工商业储能变流器PCS市场格局的重构
碳化硅(SiC)模块方案(如BMF240R12E2G3)对工商业储能变流器PCS市场格局产生颠覆性的重构: 2025年,SiC模块方案(如BMF240R12E2G3)凭借效率、成本和政策支持的三重优势,将重…...
Redis入门(Java中操作Redis)
目录 一 基础概念 1. Redis 核心特点 2. Redis 与 MySQL 的对比 3. Redis的开启与使用 二 Redis的常用数据类型 1 基础概念 2 数据结构的特点 三 Redis基础操作命令 1 字符串操作命令 2 哈希操作命令 3 列表操作命令 4 集合操作命令 5 有序集合操作命令 6 通用命令…...
DISTRIBUTED PRIORITIZED EXPERIENCE REPLAY(分布式优先级体验回放)论文阅读
标题:DISTRIBUTED PRIORITIZED EXPERIENCE REPLAY(分布式优先级体验回放) 作者:John Quan, Dan Horgan,David Budden,Gabriel Barth-Maron 单位: DeepMind 发表期刊:Machine Learning 发表时…...
Prometheus架构组件
Prometheus 是一个开源的监控与告警系统,专为动态的云原生环境(如 Kubernetes)设计。其架构基于主动拉取(Pull)模型,支持多维数据模型和灵活的查询语言(PromQL)。以下是 Prometheus …...
算法思想之位运算(一)
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之位运算(一) 发布时间:2025.4.12 隶属专栏:算法 目录 算法介绍六大基础位运算符常用模板总结 例题位1的个数题目链接题目描述算法思路代码实现 比特位计数题目链接题目描述算法思路…...
【基于Servlet技术处理表单】
文章目录 一、实验背景与目的二、实验设计与实现思路1. 功能架构2. 核心代码实现3. 测试用例 总结 一、实验背景与目的 本次实验旨在深入理解Servlet工作原理,掌握JSP与Servlet的协同开发,实现前端表单与后端数据处理的交互。具体目标包括:设…...
[OS] mmap | fd是什么 | inode机制 | vfs封装
Linux 下一切皆文件 * 统统抽象为文件,系统封装一层结构体之后,通过指针来访问 * 文章后面的 几个思考题都挺好的 * 后面涉及到的inode 机制,去年暑假的这篇文章,有详细的记录到过 【Linux】(26) 详解磁盘与文件系统:从…...
cout和printf的区别
在C编程中,printf和cout都是用于输出的,但它们之间存在一些关键的区别。printf是C语言中的标准输出函数,而cout是C中引入的一个对象,它是iostream库的一部分。 printf的特点 printf是一个函数,需要明确指定输出的格式…...
STL详解 - vector的模拟实现
目录 一、整体设计 1.1 核心结构 1.2 迭代器实现 二、核心接口实现 2.1 构造函数系列 🌴默认构造 🌴迭代器范围构造 🌴元素填充构造 2.2 拷贝控制 🌵拷贝构造函数 🌵赋值运算符(现代写法…...
C++第三方库【JSON】nlohman/json
文章目录 优势使用API从文件中读取json从json文本创建json对象直接创建并操作json对象字符串 <> json对象文件流 <> json对象从迭代器读取像使用STL一样的访问STL容器转化为 json数组STL容器 转 json对象自定义类型转化为 json对象 限制 优势 直观的语法ÿ…...
超细的ollama下载以及本地部署deepseek项目
Ollama 是一个开源的本地化大语言模型(LLM)运行和部署工具,专注于让开发者能够快速、高效地在本地运行和管理各种开源大语言模型(如 LLaMA、Mistral、GPT 系列等)。它提供了一个统一的接口,简化了模型下载、…...
【Sequelize】关联模型和孤儿记录
一、关联模型的核心机制 1. 关联类型与组合规则 • 基础四类型: • hasOne:外键存储于目标模型(如用户档案表存储用户ID) • belongsTo:外键存储于源模型(如订单表存储用户ID) • hasMany&…...
Sentinel实战教程:流量控制与Spring Boot集成
Sentinel实战教程:流量控制与Spring Boot集成 1. Sentinel简介与核心概念 1.1 什么是Sentinel? Sentinel是阿里巴巴开源的流量控制组件,主要用于微服务架构中的流量防护。它通过限流、熔断、热点防护等机制,帮助系统在高并发场景下保持稳定运行。 1.2 核心功能与术语 流…...
编程技能:调试01,调试介绍
专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 (一)WIn32 专栏导航 上一篇:编程基础:位运算07,右移 回到目录 下一…...
循环神经网络 - 扩展到图结构之递归神经网络
本文我们来学习递归神经网络(Recursive Neural Network,RecNN),其是循环神经网络在有向无循环图上的扩展 。 递归神经网络是一类专门设计来处理具有层次结构或树形结构的数据的神经网络模型。它与更常见的循环神经网络(Recurrent Neural Net…...
【Kubernetes基础--Pod深入理解】--查阅笔记2
深入理解Pod 为什么要有个Pod1. 容器协作与资源共享2. 简化调度和资源管理3. 设计模式支持 Pod 基本用法Pod 容器共享 VolumePod 的配置管理ConfigMap 概述创建 ConfigMap 资源对象在 Pod 中使用 ConfigMap使用 ConfigMap 的限制条件 为什么要有个Pod Pod 的引入并非技术冗余&…...
【euclid】10.3 2D变换模块(transform2d.rs)bytemuck trait
这段代码是一个 Rust 的 unsafe trait 实现,用于标记 Transform2D 类型在特定条件下可以安全地被视为由全零字节组成的有效实例。让我们详细解释每个部分: 代码分解: #[cfg(feature "bytemuck")] unsafe impl<T: Zeroable, S…...
Maven超级详细安装部署
1.到底什么是Maven?搞清楚这个 Maven 是一个项目管理工具,主要用于 Java 项目的构建、依赖管理和文档生成。 它基于项目对象模型(POM),通过 pom.xml 文件定义项目的配置。 (简单说破:就是工程…...
