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

Mybatis plus自定义分页

引言

在众多现代Web应用中,数据分页是一项基础且关键的功能,它不仅可以显著提升用户体验,还能有效减少服务器的负载。传统的分页方法通常在数据库层面进行,通过SQL查询直接返回分页结果。这种方法在大多数情况下都非常高效。然而,当遇到需要在返回数据前执行复杂处理或过滤的业务场景时,传统分页可能就显得力不从心。本文将介绍一种在服务层进行分页处理的策略,这种策略提供了更高的灵活性,适用于复杂的业务逻辑处理。

问题描述

在某些复杂的业务场景中,我们可能需要对数据集进行多层过滤、排序或其他预处理操作,而这些操作可能需要在应用层面完成,而非数据库层面。在这种情况下,如果我们仍然坚持使用传统的数据库分页方法,可能会面临以下问题:

  • 数据库返回的分页结果可能不符合实际应用需求,因为部分业务逻辑只能在应用层实现。
  • 复杂的查询条件可能会导致SQL查询效率低下,甚至影响数据库性能。

解决方案:服务层分页

为了解决上述问题,我们可以将分页逻辑从数据库层移到服务层,即在获取到全部相关数据后,在应用服务器上进行分页处理。以下是实现此策略的示例代码,使用Spring Boot框架:

@GetMapping("/list")
public TableDataInfo search(BwProject bwProject) {PageDomain pageDomain = TableSupport.buildPageRequest();Integer pageNum = pageDomain.getPageNum();Integer pageSize = pageDomain.getPageSize();List<BwProjectVo> fullList = bwProjectService.selectBwProjectBwProDt(bwProject);int total = fullList.size(); // 保存总记录数// 使用 long 类型计算跳过的记录数,避免整数溢出long skip = (long) (pageNum - 1) * pageSize;List<BwProjectVo> pageList = fullList.stream().skip(skip) // 使用 long 类型的 skip 确保安全.limit(pageSize) // 限制当前页显示的数量.collect(Collectors.toList());TableDataInfo rspData = new TableDataInfo();rspData.setCode(HttpStatus.SUCCESS);rspData.setMsg("查询成功");rspData.setRows(pageList);rspData.setTotal(total);return rspData;
}

优势与应用场景

  • 灵活性: 这种方法允许开发者在加载全部数据后根据复杂的业务规则进行分页,从而提供更加个性化的用户体验。
  • 适用性: 特别适合于数据量适中且需要高度定制处理的场景,例如在内存中动态调整数据内容、格式或顺序。

性能考量

  • 数据量: 当数据量较大时,这种方法可能会增加服务器的内存压力和处理时间,因此建议仅在数据量可控的情况下使用。
  • 优化: 对于大规模数据,应考虑先通过粗略的数据库查询减少数据量,再在服务层进行精细处理和分页。

结论

服务层分页是一种有效的数据处理策略,它通过在应用层面提供数据分页,使得开发者可以在满足复杂业务需求的同时,保持系统的响应性和灵活性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • hive动态分区导致xceivercount超限,hdfs无法创建新连接
  • R语言实现神经网络ANN
  • 从微软发iPhone,聊聊企业设备管理
  • 【机器学习】无监督学习和自监督学习
  • Kafka(四) Consumer消费者
  • 大鲸鱼docker-compose单机容器集群编排工具
  • C语言实例-约瑟夫生者死者小游戏
  • jenkins 插件版本冲突
  • JDBC常见用法
  • 下载安装VSCode并添加插件作为仓颉编程入门编辑器
  • Tensorflow入门实战 T09进行猫狗识别2
  • maven 私服搭建(tar+docker)
  • conda 复现论文部署环境常用操作
  • 缓存弊处的体验:异常
  • NEEP-EN2-2019-Text4
  • egg(89)--egg之redis的发布和订阅
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Flex布局到底解决了什么问题
  • js算法-归并排序(merge_sort)
  • PermissionScope Swift4 兼容问题
  • spring security oauth2 password授权模式
  • Transformer-XL: Unleashing the Potential of Attention Models
  • underscore源码剖析之整体架构
  • Web标准制定过程
  • 创建一个Struts2项目maven 方式
  • 分享一份非常强势的Android面试题
  • 前端_面试
  • 前端路由实现-history
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 一、python与pycharm的安装
  • Python 之网络式编程
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (152)时序收敛--->(02)时序收敛二
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (七)Knockout 创建自定义绑定
  • (十六)视图变换 正交投影 透视投影
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)3D模板阴影原理
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • ..回顾17,展望18
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • 。Net下Windows服务程序开发疑惑
  • @media screen 针对不同移动设备
  • [ C++ ] STL---stack与queue
  • [ SNOI 2013 ] Quare
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • []我的函数库
  • [012-1].第12节:Mysql的配置文件的使用
  • [2019/05/17]解决springboot测试List接口时JSON传参异常