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

Java 实现分页的几种方式详解

目录

  1. 分页概述
  2. Java实现分页的几种方式
    • 手动分页
    • 基于JDBC的分页
    • 基于Hibernate的分页
    • 基于MyBatis的分页
    • [基于Spring Data JPA的分页](#基于Spring Data JPA的分页)
    • 使用PageHelper插件的分页
  3. 分页中的注意事项
  4. 总结

分页概述

分页是指将大量数据分成若干小块,每次只显示其中一部分,以减少系统负载并提升用户体验。实现分页的关键在于控制每页显示的数据量,以及用户请求的当前页数。

Java实现分页的几种方式

手动分页

手动分页是最基本的分页方式,通过Java代码手动控制数据的分页。以下是一个简单的例子:

import java.util.ArrayList;
import java.util.List;public class ManualPagination {public static void main(String[] args) {List<Integer> data = new ArrayList<>();for (int i = 1; i <= 100; i++) {data.add(i);}int pageSize = 10;int currentPage = 3;List<Integer> pagedData = paginate(data, pageSize, currentPage);System.out.println(pagedData);}public static <T> List<T> paginate(List<T> data, int pageSize, int currentPage) {int startIndex = (currentPage - 1) * pageSize;int endIndex = Math.min(startIndex + pageSize, data.size());if (startIndex > endIndex) {return new ArrayList<>();}return data.subList(startIndex, endIndex);}
}

这种方式适用于数据量较小的情况,对于大数据集,效率较低。

基于JDBC的分页

在JDBC中实现分页,主要通过SQL语句来控制数据的分页。以下是一个基于MySQL的例子:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;public class JdbcPagination {private static final String URL = "jdbc:mysql://localhost:3306/your_database";private static final String USER = "root";private static final String PASSWORD = "password";public static void main(String[] args) {int pageSize = 10;int currentPage = 3;List<String> data = paginate(pageSize, currentPage);data.forEach(System.out::println);}public static List<String> paginate(int pageSize, int currentPage) {List<String> data = new ArrayList<>();String sql = "SELECT * FROM your_table LIMIT ?, ?";try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);PreparedStatement ps = conn.prepareStatement(sql)) {ps.setInt(1, (currentPage - 1) * pageSize);ps.setInt(2, pageSize);try (ResultSet rs = ps.executeQuery()) {while (rs.next()) {data.add(rs.getString("your_column"));}}} catch (Exception e) {e.printStackTrace();}return data;}
}

这种方式适用于需要直接操作数据库的情况,效率较高。

基于Hibernate的分页

Hibernate是一个常用的ORM框架,通过它可以方便地实现分页。以下是一个例子:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;import java.util.List;public class HibernatePagination {public static void main(String[] args) {Configuration cfg = new Configuration().configure();SessionFactory sessionFactory = cfg.buildSessionFactory();Session session = sessionFactory.openSession();int pageSize = 10;int currentPage = 3;List<?> data = session.createQuery("FROM YourEntity").setFirstResult((currentPage - 1) * pageSize).setMaxResults(pageSize).list();data.forEach(System.out::println);session.close();sessionFactory.close();}
}

这种方式适用于使用Hibernate进行数据持久化的项目,能够很好地与其他Hibernate功能集成。

基于MyBatis的分页

MyBatis是另一个流行的ORM框架,它通过Mapper接口和XML配置文件实现数据库操作。以下是一个基于MyBatis的分页例子:

<!-- MyBatis Mapper XML Configuration -->
<select id="selectPage" parameterType="map" resultType="YourEntity">SELECT * FROM your_tableLIMIT #{offset}, #{pageSize}
</select>
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.Reader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class MyBatisPagination {public static void main(String[] args) {Reader reader = Resources.getResourceAsReader("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);SqlSession session = sqlSessionFactory.openSession();int pageSize = 10;int currentPage = 3;Map<String, Object> params = new HashMap<>();params.put("offset", (currentPage - 1) * pageSize);params.put("pageSize", pageSize);List<YourEntity> data = session.selectList("selectPage", params);data.forEach(System.out::println);session.close();}
}

MyBatis提供了灵活的SQL配置方式,适用于复杂查询需求。

基于Spring Data JPA的分页

Spring Data JPA是Spring框架中的一个模块,通过它可以方便地实现分页功能。以下是一个例子:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;@Service
public class YourService {@Autowiredprivate YourRepository repository;public void paginate(int pageSize, int currentPage) {Pageable pageable = PageRequest.of(currentPage - 1, pageSize);Page<YourEntity> page = repository.findAll(pageable);page.getContent().forEach(System.out::println);}
}
import org.springframework.data.jpa.repository.JpaRepository;public interface YourRepository extends JpaRepository<YourEntity, Long> {
}

Spring Data JPA简化了分页查询的实现,适用于使用Spring框架进行开发的项目。

使用PageHelper插件的分页

PageHelper是一个MyBatis分页插件,可以通过简单的配置实现分页功能。以下是一个例子:

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.Reader;
import java.util.List;public class PageHelperPagination {public static void main(String[] args) {Reader reader = Resources.getResourceAsReader("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);SqlSession session = sqlSessionFactory.openSession();int pageSize = 10;int currentPage = 3;PageHelper.startPage(currentPage, pageSize);List<YourEntity> data = session.selectList("selectPage");PageInfo<YourEntity> pageInfo = new PageInfo<>(data);pageInfo.getList().forEach(System.out::println);session.close();}
}

PageHelper插件简化了分页实现,适用于使用MyBatis的项目。

分页中的注意事项

  1. 性能优化:分页查询可能会对数据库性能产生影响,特别是当数据量很大时。可以通过优化索引、减少不必要的查询字段等方式提升性能。
  2. 用户体验:分页不仅要考虑技术实现,还要考虑用户体验。可以在前端实现无缝滚动加载、分页导航等功能,提升用户交互体验。
  3. 数据一致性:分页查询时要注意数据的一致性,特别是在高并发环境下,可能需要考虑数据的版本控制和乐观锁机制。
  4. 安全性:避免通过URL参数直接传递分页参数,防止恶意用户构造大页数或小页数的请求,导致系统负载增加。

总结

分页是Web开发中的一项基础功能,本文介绍了Java实现分页的几种常见方式,包括手动分页、基于JDBC的分页、基于Hibernate的分页

、基于MyBatis的分页、基于Spring Data JPA的分页和使用PageHelper插件的分页。每种方式都有其适用场景和优势,开发者可以根据具体需求选择合适的分页方案。

希望这篇关于Java实现分页的技术博客能够帮助你更好地理解和掌握分页技术。如果你有其他关于Java开发的疑问,欢迎随时联系我。

相关文章:

Java 实现分页的几种方式详解

目录 分页概述Java实现分页的几种方式 手动分页基于JDBC的分页基于Hibernate的分页基于MyBatis的分页[基于Spring Data JPA的分页](#基于Spring Data JPA的分页)使用PageHelper插件的分页 分页中的注意事项总结 分页概述 分页是指将大量数据分成若干小块&#xff0c;每次只显…...

vite构建vue3项目hmr生效问题踩坑记录

vite构建vue3项目hmr生效问题踩坑记录 hmr的好处 以下是以表格形式呈现的前端开发中HMR&#xff08;热模块替换&#xff09;带来的好处&#xff1a; 好处描述提升开发效率允许开发者在不刷新整个页面的情况下实时更新修改的代码&#xff0c;减少等待时间保持应用状态在模块替…...

区块链赋能民生大数据

区块链技术作为一种新兴的信息技术&#xff0c;其在民生大数据领域的应用正逐渐展现出巨大的潜力和价值。以下是对区块链赋能民生大数据的详细阐述&#xff1a; 一、区块链技术概述 区块链是一种去中心化、分布式账本技术&#xff0c;具有数据不可篡改、可追溯、公开透明等特…...

10 Vue 特性要点

Vue2 特性要点 Vue2 源码理解 Vue 双向数据绑定 先从单向绑定切入单向绑定非常简单,就是把Mode1绑定到view,当我们用Javascript代码更新Model时, view就会自动更新 双向绑定就很容易联想到了,在单向绑定的基础上,用户更新了View, Mode1的数据也自动被更新了 因为 Vue 是数据双向…...

ESP32和mDNS学习

目录 mDNS的作用mDNS涉及到的标准文件组播地址IPv4 多播地址IPv6 多播地址预先定义好的组播地址 mDNS调试工具例程mDNS如何开发和使用注册服务查询服务 mDNS的作用 mDNS 是一种组播 UDP 服务&#xff0c;用来提供本地网络服务和主机发现。 你要和设备通信&#xff0c;需要记住…...

学习SQL如何使用CASE语句查询分析设备状态

学习SQL如何使用CASE语句查询分析设备状态 一、前言1. 问题背景2. SQL查询分析3. SQL查询解析 二、结论 一、前言 在实际应用中&#xff0c;经常需要对设备的状态进行监控和分析。通过SQL查询&#xff0c;我们可以有效地从数据库中提取和计算设备的状态信息。本文将介绍如何编…...

Gartner发布2024年零信任网络技术成熟度曲线:20项零信任相关的前沿和趋势性技术

大多数组织都制定了零信任信息安全策略&#xff0c;而网络是零信任实施领域的顶级技术。此技术成熟度曲线可以帮助安全和风险管理领导者确定合适的技术&#xff0c;以将零信任原则嵌入其网络中。 战略规划假设 到 2026 年&#xff0c;15% 的企业将在企业拥有的局域网上用 ZTNA …...

React hook 之 useState

在组件的顶部定义状态变量&#xff0c;并传入初始值&#xff0c;确保当这些状态变量的值发生变化时&#xff0c;页面会重新渲染。 const [something,setSomething] useState(initialState); useState 返回一个由两个值组成的数组&#xff1a;1、当前的 state&#xff0c;在首次…...

jenkins中shell脚本中使用构建参数化Groovy变量的四种方式

jenkins中shell脚本中使用构建参数化Groovy变量的四种方式: 以字符变量为例&#xff1a; 流水线代码&#xff1a; pipeline {agent {//label "${server}"label "${28}"}stages {stage(Hello) {steps {echo Hello Worldecho "${28}"echo "…...

Robot Operating System——ParameterEventHandler监控Parameters的增删改行为

大纲 创建订阅"/parameter_events"的Node监控自身Node内部Parameter监控自身Node外部Parameter监听所有Node的所有Parameter的变动执行效果总结 在《Robot Operating System——AsyncParametersClient监控Parameters的增删改行为》一文中&#xff0c;我们通过AsyncPa…...

计算机网络(Wrong Question)

一、计算机网络体系结构 1.1 计算机网络概述 D 注&#xff1a;计算机的三大主要功能是数据通信、资源共享、分布式处理。&#xff08;负载均衡、提高可靠性&#xff09; 注&#xff1a;几段链路就是几段流水。 C 注&#xff1a;记住一个基本计算公式&#xff1a;若n个分组&a…...

Docker+consul容器服务的更新与发现

1、Consul概述 &#xff08;1&#xff09;什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点…...

全网最详细!! Linux 安装、配置教程

一、下载安装包 首先去官网下载VMware最新版本&#xff0c;以及发行版CentOS -7&#xff0c;懒得下载的可以私信我&#xff0c;我给你发包 其中&#xff0c;CentOS&#xff08;Community Enterprise Operating System&#xff09;是一个基于Linux的开源操作系统&#xff0c;它是…...

cocos creator 3学习记录01——如何替换图片

一、动态加载本地图片 1、通过将图片关联到CCClass属性上来进行代码切换。 1、这种方法&#xff0c;需要提前在脚本文件中声明好代表图片的CCClass属性。 2、然后拖动图片资源&#xff0c;到脚本内声明好的属性上以进行关联。 3、然后通过程序&#xff0c;来进行切换展示。…...

【Android Compose】ListView效果

【Android Compose】ListView效果 1、Column、Row 和 Box2、LazyColumn和LazyRow3、Compose 中的状态4、ListView效果5、android-compose-codelabs Jetpack Compose 使用入门 Jetpack Compose 教程 Jetpack Compose 1、Column、Row 和 Box Compose 中的三个基本标准布局元素是 …...

【Pytorch实战教程】Pytorch中.detach()的详细介绍

detach() 是 PyTorch 中用于分离张量的计算图的一个方法。它在处理计算图时非常有用,尤其是在需要停止梯度传播的情况下。以下是 detach() 方法的详细介绍: 方法概述 detach() 方法返回一个新的张量,从当前计算图中分离出来,即返回的张量不会参与梯度计算。这在某些情况下…...

AR 眼镜之-充电动画定制-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 充电动画 1. &#x1f531; 技术方案 1.1 方案介绍 1.2 实现方案 关机充电动画 亮屏/锁屏充电动画 2. &#x1f4a0; 关机充电动画 2.1 关机充电动画核心处理类与路径 2.2 实现细节 步骤一&#xff1a;1&#xff09;定制 …...

AJAX-XMLHttpRequest 详解

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 前言 XMLHttpRequest 概述 主要用途 工作流程 示例代码 GET 请求示例 POST 请求示例 注意事项 工作…...

内容管理系统 Contentful 与 Baklib

对于希望管理其产品和服务的在线文档或知识库以支持其客户和员工的组织来说&#xff0c;市场上有太多的平台和工具。 遵循的做法之一是使用无头内容管理系统 (CMS)。 如果您是这样的组织之一&#xff0c;正在考虑使用无头 CMS - Contentful 之一来管理您的在线知识库&#xff0…...

[Mysql-视图和存储过程]

视图 视图是从一个或者几个基本表&#xff08;或视图&#xff09;导出的表。它与基 本表不同&#xff0c;是一个虚表。 创建使用视图 # 视图 -- 视图只能用来查询&#xff0c;不能做增删改 -- 创建视图 -- create view 视图名【view_xxx / v_xxx】 -- as 查询语句 create view…...

基于RAG与智能分块构建LLM本地知识库:llm-books开源工具实战

1. 项目概述&#xff1a;一个为LLM“喂书”的开源工具最近在折腾大语言模型本地应用的朋友&#xff0c;可能都遇到过同一个头疼的问题&#xff1a;怎么让模型“读懂”我手头那几百页的PDF报告、电子书或者研究论文&#xff1f;直接复制粘贴&#xff1f;上下文长度不够。手动分段…...

AMD NPU加速GPT-2微调:边缘AI训练实战解析

1. AMD NPU与客户端AI训练的技术背景在AI模型部署领域&#xff0c;边缘计算正经历着从单纯推理到完整训练工作流的范式转变。传统上&#xff0c;像GPT-2这样的语言模型训练完全依赖云端GPU集群&#xff0c;但这种方式存在数据隐私泄露、网络延迟和持续服务依赖等固有缺陷。AMD …...

强化学习优化文本生成:从原理到实战,打造可控AI创作工具

1. 项目概述&#xff1a;当强化学习遇上文本生成如果你玩过AI绘画&#xff0c;一定对“提示词工程”不陌生——通过精心设计的文字描述&#xff0c;让模型画出你想要的画面。但你是否想过&#xff0c;这个过程本身也可以被“优化”&#xff1f;比如&#xff0c;你希望模型生成一…...

Sealos云操作系统:基于Kubernetes内核的桌面化云原生平台实践

1. 项目概述&#xff1a;从“集群”到“桌面”的云原生新范式如果你和我一样&#xff0c;长期在云原生领域摸爬滚打&#xff0c;那么对“Kubernetes集群”的部署和管理一定不会陌生。从早期的kubeadm手动搭建&#xff0c;到后来各种发行版和托管服务&#xff0c;我们一直在追求…...

Task发展历程:从简单任务运行器到现代自动化工具的完整演进史

Task发展历程&#xff1a;从简单任务运行器到现代自动化工具的完整演进史 【免费下载链接】task A fast, cross-platform build tool inspired by Make, designed for modern workflows. 项目地址: https://gitcode.com/gh_mirrors/ta/task Task是一个快速、跨平台的构建…...

将Hermes Agent工具连接到Taotoken的配置要点详解

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 将Hermes Agent工具连接到Taotoken的配置要点详解 Hermes Agent 是一款支持自定义模型提供方的智能体开发工具。通过将其后端连接到…...

终极指南:如何在Jetson/Raspberry Pi上快速部署CLIP-as-service边缘AI搜索服务 [特殊字符]

终极指南&#xff1a;如何在Jetson/Raspberry Pi上快速部署CLIP-as-service边缘AI搜索服务 &#x1f680; 【免费下载链接】clip-as-service &#x1f3c4; Scalable embedding, reasoning, ranking for images and sentences with CLIP 项目地址: https://gitcode.com/gh_mi…...

Unity3D项目跨平台部署实战:从Windows到Linux的完整流程与避坑指南

1. 环境准备&#xff1a;搭建跨平台开发基础 跨平台部署的第一步是确保开发环境配置正确。很多开发者容易忽略这一步&#xff0c;结果在后续流程中遇到各种奇怪的问题。我在实际项目中遇到过多次因为环境不匹配导致的编译失败&#xff0c;所以特别强调环境准备的重要性。 首先需…...

大模型面试——Transformer 中的位置编码(Positional Encoding)的意义

Transformer 中的位置编码(Positional Encoding)的意义 位置编码的存在是因为 Transformer 的核心机制 Self-Attention 是“置换不变性”的。 弥补时序信息缺失:与 RNN 不同,Transformer 放弃了递归结构以实现并行化,导致模型无法识别输入 Token 的先后顺序(即“词袋模型…...

Source Han Serif CN:7款免费开源字体如何重塑你的中文排版体验

Source Han Serif CN&#xff1a;7款免费开源字体如何重塑你的中文排版体验 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在数字内容爆炸的时代&#xff0c;选择一款优秀的中文字体往…...