Java自定义分页,结合MySQL的Limit函数来实现快速高效的分页

Java 分页的实现原理 Java 分页的实现原理主要围绕‌‌和‌‌展开,核心是通过限制每次查询的数据量,提升性能和用户体验。 阅读详情

前言

在项目开发过程中,常常聊到的话题就是分页,怎么分页?不管使用什么方法来实现,最终是需要根据系统进行统一的,不能张三使用这个插件来分页,李四使用那个插件来分页,王五则利用数据库函数来分页,一个系统五花八门,花里胡哨滴,这样是不行的,在一个系统中要么统一的使用某个分页插件,要么使用统一使用数据库分页函数来实现分页。

通过本篇博文的学习,讲学会基于MySQL的数据分页,利用MySQL中的Limit函数来达到快速高效分页的目的,为了通俗易懂,博主已细分为了传统的三层,即:Dao层/Service层/Controller层,如有不到之处,欢迎指正!

 

Java自定义分页,结合MySQL的Limit函数来实现快速高效的分页

 

1、员工业务 Controller 层,示例代码内容如下:

package com.huazai.b2c.aiyou.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 
 * @author HuaZai
 * @contact who.seek.me@java98k.vip
 *          <ul>
 * @description 员工控制层
 *              </ul>
 * @className EmployeeController
 * @package com.huazai.b2c.aiyou.controller
 * @createdTime 2016年7月22日 上午9:56:39
 *
 * @version V1.0.0
 */
@Slf4j
@RestController
@Api(value = "/employee")
@RequestMapping("/employee")
public class EmployeeController
{

	@Autowired
	private EmployeeService employeeService;

	@Autowired
	private DepartmentService departmentService;

	/**
	 * Description:[获取员工分页信息]
	 *
	 * @param pageSize
	 *            [单页大小]
	 * @param pageNo
	 *            [页数]
	 * @return ResponseData
	 */
	@SysLog("员工管理模块-获取分页员工信息")
	@GetMapping("/getPageList")
	@ApiOperation(value = "/getPageList", notes = "获取员工分页信息")
	public ResponseData getPageList(
			@RequestParam(name = "length") @ApiParam(name = "length", value = "页大小", defaultValue = "20") Long pageSize,
			@RequestParam(name = "current") @ApiParam(name = "current", value = "页数", defaultValue = "1") Long pageNo,
			@ApiParam(name = "employee", value = "搜索员工参数实体") Employee employee
			)
	{
		PageBean<EmployeeDto> employeePage;
		try
		{
			
			// 获取员工分页信息
			employeePage = employeeService.selectPageWithParam(pageNo, pageSize, employee);
		} catch (Exception e)
		{
			
			log.error(Constant.INFO_LOG_MSG, e.getMessage());
			return ResponseData.error(RespCodeEnum.ERROR_INTERNAL_SERVER.getCode(), "分页员工信息获取失败");
		}
		
		return ResponseData.ok().put("employeePage", employeePage);
	}

}

 

2、员工业务 Service 接口层,示例代码内容如下:

package com.huazai.b2c.aiyou.service;

import com.baomidou.mybatisplus.service.IService;

import java.util.List;

/**
 * 
 * @author HuaZai
 * @contact who.seek.me@java98k.vip
 *          <ul>
 * @description 员工服务接口层
 *              </ul>
 * @className EmployeeService
 * @package com.huazai.b2c.aiyou.service
 * @createdTime 2016年7月22日 上午11:12:27
 *
 * @version V1.0.0
 */

public interface EmployeeService extends IService<Employee>
{

	/**
	 * 查询所有员工账户信息
	 *
	 * @param pageNo
	 * @param pageSize
	 * @param empNo
	 * @return
	 */
	PageBean<EmployeeDto> selectPageWithParam(Long pageNo, Long pageSize, Employee employee);

}

 

3、员工业务 ServiceImpl 层,示例代码内容如下:

package com.huazai.b2c.aiyou.service.impl;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;

/**
 * 
 * @author HuaZai
 * @contact who.seek.me@java98k.vip
 *          <ul>
 * @description 员工服务实现层
 *              </ul>
 * @className EmployeeServiceImpl
 * @package com.huazai.b2c.aiyou.service.impl
 * @createdTime 2016年7月22日 上午11:16:54
 *
 * @version V1.0.0
 */
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService
{
	@Autowired
	private EmployeeMapper employeeMapper;

	@Override
	public PageBean<EmployeeDto> selectPageWithParam(Long pageNo, Long pageSize, Employee employee)
	{
		// 获取总体数据
		List<EmployeeDto> employeePages = employeeMapper.selectEmployeeeByPage(null, null, employee);
		Long totalSize = Long.valueOf(employeePages.size());
		PageBean pageBean = new PageBean(pageNo, pageSize, totalSize);
		// 获取数据索引
		Long startIndex = pageBean.getStartIndex();
		// 获取当前分页数据
		List<EmployeeDto> employeeDtos = employeeMapper.selectEmployeeeByPage(startIndex,
				pageSize, employee);
		pageBean.setDataList(employeeDtos);

		return pageBean;
	}

}

 

4、员工业务 Mapper 层,示例代码内容如下:

package com.huazai.b2c.aiyou.mapper;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Repository;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 
 * @author HuaZai
 * @contact who.seek.me@java98k.vip
 *          <ul>
 * @description TODO
 *              </ul>
 * @className EmployeeMapper
 * @package com.huazai.b2c.aiyou.mapper
 * @createdTime 2016年7月22日 上下午14:16:52
 *
 * @version V1.0.0
 */
@Repository
public interface EmployeeMapper extends BaseMapper<Employee>
{
	List<EmployeeDto> selectEmployeeByPage(@Param(value = "pageNo") Long pageNo,
			@Param(value = "pageSize") Long pageSize, @Param(value = "employee") Employee employee);

}

 

5、Mapper 的配置文件 Mapper.xml,示例内容如下:

   <select id="selectEmployeeByPage" resultType="com.huazai.b2c.aiyou.dto.resp.employee.EmployeeDto">
        SELECT e.id, e.name, e.address FROM employee e WHERE e.status IN (1, 2)
        <if test="employee.name != null and employee.name != ''">
            and e.name like concat('%',#{employee.name},'%')
        </if>
        <if test="pageNo != null" >
            limit #{pageNo}, #{pageSize}
        </if>
    </select>

 

6、分页PageBeans工具类,示例内容如下:

package com.huazai.b2c.aiyou.common;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.util.List;

/**
 * 
 * @author HuaZai
 * @contact who.seek.me@java98k.vip
 *          <ul>
 * @description 分页工具类
 *              </ul>
 * @className PageBean
 * @package com.huazai.b2c.aiyou.common
 * @createdTime 2016年7月17日 上午10:40:21
 *
 * @version V1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class PageBean<T>
{

	// 当前页
	private Long currentNo;
	// 单页显示数据条数
	private Long pageSize;
	// 总的数据条数
	private Long totalRecord;
	// 总页数
	private Long totalPage;
	// 开始索引
	private Long startIndex;
	// 分页显示
	private Long start;
	private Long end;
	// 数据集合
	private List<T> dataList;

	/**
	 *
	 * @param currentNo
	 *            当前页
	 * @param pageSize
	 *            单页显示数据条数
	 * @param totalRecord
	 *            总的数据条数
	 */
	public PageBean(Long currentNo, Long pageSize, Long totalRecord)
	{
		this.currentNo = currentNo;
		this.pageSize = pageSize;
		this.totalRecord = totalRecord;
		// 获取总页数
		if (totalRecord % pageSize == 0)
		{
			this.totalPage = totalRecord / pageSize;
		} else
		{
			this.totalPage = totalRecord / pageSize + 1;
		}

		this.startIndex = (currentNo - 1) * pageSize;
		this.start = 1L;
		this.end = 5L;
		if (totalPage <= 5)
		{
			this.end = this.totalPage;
		} else
		{
			this.start = currentNo - 2;
			this.end = currentNo + 2;
			if (start < 0)
			{
				start = 1L;
				end = 5L;
			}
			if (end > this.totalPage)
			{
				this.end = totalPage;
				this.start = end - 5;
			}
		}
	}
}

 

 

 


 好了,关于 Java自定义分页,结合MySQL的Limit关键字实现快速高效的分页 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。 
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。


作       者:华    仔
联系作者:who.seek.me@java98k.vip
来        源:优快云 (Chinese Software Developer Network)
原        文:https://blog.youkuaiyun.com/Hello_World_QWP/article/details/89352124
版权声明:本文为博主原创文章,请在转载时务必注明博文出处!
SQL分页性能陷阱:OFFSET、ORDER BY与LIMIT的协同原理与优化 OFFSET 是 SQL 分页中最易被误解的基础操作,其本质并非物理定位,而是基于 ORDER BY 排序结果集的逐行计数丢弃,时间复杂度为 O(N),导致深度分页(如 OFFSET 10000)性能断崖式下降。真正决定分页稳定性的核心是 ORDER BY 字段的确定性与索引支持——无 ORDER BY 的 OFFSET 查询结果不可预测,低选择性字段将引发数据漂移。结合 LIMIT 后,三者构成串行流水线:先排序、再丢弃、最后截取。工程实践中,OFFSET/LIMIT 仅适用于小数据量(<10 万行)和浅 阅读详情

相关推荐

mysql的limit用法、逻辑分页和物理分页

mysql的limit用法、逻辑分页和物理分页

念兮为美 3万+

java实现简单分页功能

 虽然现在有很多好用的框架,对分页进行支持,很简单的就把分页的效果做出来,但是如果自己手写是一个怎样的流程的?今天就来说说它,手动实现分页效果。                             --WH   一、分页的思路     首先我们得知道写分页代码时的思路,保持思路清晰,有步骤的进行,才能行云如水。先来看看分页的效果                           ...

Ricartc的编程梦 2881

MySQL深度分页优化实战指南

在上一期中,我们聊到了如何通过合理设计索引和查询优化器提升 MySQL 查询性能。但在实际开发中,当数据量逐渐庞大,进行深度分页查询时,数据库性能瓶颈就会显现出来。深度分页,尤其是。

喵手的博客 1149

用limit 实现java的简单分页

mysql 中limit 用法 select * from table limit m,n 在mysql中, m代表index, 默认从0 开始; n最小从m+1开始,取n条 意思是: 在table数据库中, 从m开始,拉取n条数据. limit start,size 从start条开始,获取size条数据 分页实现 前端: 将page 和 rows 两个...

xinyuezitang的博客 9569

Java万能分页代码3.0版本实战解析

为了实现通用的分页功能,我们首先需要定义一个统一的分页接口,用于规范分页查询的输入参数和输出结果。以下是一个典型的分页接口设计:// 当前页码// 每页条数// 排序字段// 排序方向// 当前页的数据// 总记录数// 总页数// 是否有数据// 是否是第一页// 是否是最后一页这个接口定义了分页查询所需的基本信息,包括当前页码、每页条目数、排序字段、排序方向以及分页数据本身等。

weixin_42620563的博客 768

单细胞实战之亚细胞分群从T/NK至CD4+T细胞——从入门到进阶(中级篇1)

亚细胞分群从T/NK至CD4+T细胞

zfyyzhys的博客 6387

Java操作MySQL数据库 limit 实现分批分页,解决内存溢出问题

## MySQL limit 分批分页取数据库,解决运行溢出问题 ## - 在查询数据库的时候,由于要查询很大的数据,上百万的级别,往往让出现内存溢出的问题,所以这时候需要分批去取数据库表中的全部数据来进行处理,最简单的方法就是使用分页查询语句:MySQL的LIMIT语句是满足这个要求的。 - 先来了解这个用法和原理:mysql LIMIT 子句用法及原理。 - 使用查询语句的时候,经常

Agly_Charlie的博客 1万+

01 AUTOSAR CP标准文档阅读指南

01 AUTOSAR CP标准文档阅读指南

汽车软件工程师 | 好奇博主 | 处女座 1133

java分页截取的 函数_Java自定义分页,结合MySQL的Limit函数来实现快速高效的分页...

前言在项目开发过程中,常常聊到的话题就是分页,怎么分页?不管使用什么方法来实现,最终是需要根据系统进行统一的,不能张三使用这个插件来分页,李四使用那个插件来分页,王五则利用数据库函数来分页,一个系统五花八门,花里胡哨滴,这样是不行的,在一个系统中要么统一的使用某个分页插件,要么使用统一使用数据库分页函数来实现分页。通过本篇博文的学习,讲学会基于MySQL的数据分页,利用MySQL中的Limit函数...

weixin_35383324的博客 310

YOLOv8中的C2f模块代码详解

在YOLOv8网络结构中,C2f模块(CSP Bottleneck with 2 Convolutions)是一个关键组件,用于实现跨阶段部分聚合

zzzyyy8的博客 3万+

PPL文档——Excel制作的甘特图加上动态今日线

当很多项目需要跟踪进度时,我们介绍一种在Excel中创建甘特图。

qq_34777858的博客 7063

深入优化MySQL深度分页:从第10000页出发,Java模拟高效分页技巧

深度分页在数据量大的场景下容易引发性能问题,MySQL 的传统LIMIT实现会导致不必要的记录扫描。通过覆盖索引、延迟关联、自增主键优化等技术手段,可以大大减少扫描的记录数,提升分页查询的效率。在实际的业务场景中,可以根据具体数据结构和查询场景选择合适的优化方式,以满足高效分页查询的需求。

hikktn的博客 1510

详解【异质图卷积网络 RGCN】回顾:图神经网络问题的三大处理步骤 | 从起源说起,RGCN核心公式解释,两种降低模型参数量/优化的方式,附核心代码实现讲解

本篇,我们深入分析和学习RGCN的原理以及为何要这么做。首先让我们来回顾对于图神经网络问题的三大处理步骤,可以说,这是该深度学习模型的基本理解,后续都是在深化其中的细节处理。然后以容易理解的方式,引出异质图卷积网络RGCN的由来,主要讲解其核心公式和论文中作者所提出的两种降低模型参数量/优化的处理办法,并给出基础分解以及块对角分解的核心实现代码讲解。最后附上RGCN源代码及说明。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1279

求求你别再用offset和limit分页了

作者:码农架构I来源:toutiao.com/i6860655404431442444不需要担心数据库性能优化问题的日子已经一去不复返了。随着时代的进步,随着野心勃勃的企业想要变成下一个...

程序员闪充宝 97

conda upgrade出现Solving environment:failed CondaValueError Malformed version string invalid chars解决方案

本文主要介绍了conda install出现Solving environment:failed、CondaValueError: Malformed version string invalid character(s),希望能对使用conda的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 步骤一 2.2 步骤二

weixin_43178406的博客 8万+

【CANoe】CAPL_ECU上电后首帧报文发出时间检测

【CANoe】CAPL_ECU上电后首帧报文发出时间检测,通过CANoe I/O口检测电压实现

星Yeah 的博客 2506

不同数据库分页查询的实现

分页查询是数据库查询中经常用到的一项操作,对查询出来的结果进行分页查询可以方便浏览。那么Oracle、SQL Server、MySQL是如何实现查询的呢?本文我们就来介绍这一部分内容。1. SQL Server 分页查询实例:一张表 tbl_FlightsDetail,有300多W记录,主键 FlightsDetailID(Guid),要求按照FlightsDetailID排序 取 3000001...

u013952133的博客 4549

Open3D(C++) 读取、可视化并保存点云【2025最新版】

博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 4616

使用子查询提高MySQL分页效率 limit

1.LIMIT n 等价于 LIMIT 0,n 偏移offset较小的时候,直接使用limit较优。 2、offset大的时候。 select * from yanxue8_visit limit 10000,10 多次运行,时间保持在0.0187左右 Select * From yanxue8_visit Where vid >=( Select vid From yanxue

Sparkjin的专栏 892

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

MySQL高效分页-mybatis插件PageHelper改进

MySQL分页在表比较大的时候,分页就会出现性能问题,MySQL的分页逻辑如下:比如select * from user limit 100000,10 它是先执行select * from user 扫描满足这个SQL语句,拿到执行结果后, 一页一页的找到行号为100000的行,返回接下来的10行数据,出现性能问题的原因有两个,1:它先全表扫描了,整个表,而不是扫描到了满足条件的数据...

weixin_30840573的博客 278

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

MySQL 数据库中百万级数据量,大神是如何分页查询?

>>号外:关注“Java精选”公众号,回复“2021面试题”关键词,领取全套500多份Java面试题文件。方法1: 直接使用数据库提供的SQL语句语句样式:MySQL中,可用...

Java精选 491

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Mysql limit 优化,百万至千万级快速分页,--复合索

本文出自:http://db.java123.net/MySQL/Mysql_limit_youhua_baiwanzhiqianwanjikuaisufenye___fuhesuo_2__39704.html MySql 性能到底能有多高?用了php半年多,真正如此深切的去思虑这个问题还是畴前天开端。有过疾苦有过掉望,到现在布满信心!MySql 这个数据库绝对是合适dba级的高手去

1万+

MySQL 百万级数据,怎么做分页查询?

点击关注公众号,Java干货及时送达作者:大神养成记来源:www.cnblogs.com/geningchao/p/6649907.html方法1: 直接使用数据库提供的SQL语句语句样式...

Java技术栈,分享最主流的Java技术 570

从传统到高效:深入解析数据库游标分页技术与实践

从传统到高效:深入解析数据库游标分页技术与实践

码农跟牛马有什么区别 1105

java 物理分页和逻辑分页

A.逻辑分页利用游标分页,好处是所有数据库都统一,坏处就是效率低。1.逻辑分页的第一种方式,利用ResultSet的滚动分页。这种分页方式依靠的是对结果集的算法来分页,因此通常被称为“逻辑分页”。步骤如下:  a.根据条件sql查询数据库。  b.得到ResultSet的结果集,由于ResultSet带有游标,因此可以使用其next()方法来指向下一条记录。  c.利用next()方法,得到分...

weixin_34344403的博客 1087

【Java 进阶篇】SQL分页查询详解

分页查询是一种用于检索数据库中数据的技术,它将结果集分成多个页面,每个页面包含一定数量的数据记录。这样做的主要目的是在处理大量数据时提高查询性能,并允许用户逐页查看数据。在应用程序中,分页查询通常用于构建数据表格、搜索结果页、新闻文章列表等需要显示大量数据的场景。SQL分页查询是一种有助于处理大量数据的重要技术。不同的数据库管理系统有不同的语法来执行分页查询,但基本的概念是相似的。在执行分页查询时,性能是一个重要的考虑因素,需要进行查询和数据库引擎的优化,以确保快速且高效的数据检索。

繁依Fanyi的博客 1378
上一篇: Java自定义分页工具类 PageBean 的提取与封装
下一篇: SolrServerException: No collection param specified on request and no default collection has been set
TechBro华仔
TechBro华仔 优质创作者: Java技术领域 优质创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄11年 5万+粉丝 430原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TechBro华仔

日拱一卒无有尽,功不唐捐终入海

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值