mybatisMysql 分页查询

温故而知新,这里记录一下

一、引言

        分页查询每个人程序猿几乎都使用过,但是有部分同学不懂什么是物理分页和逻辑分页。

        物理分页:

        相当于执行了limit分页语句,返回部分数据。物理分页只返回部分数据占用内存小,能够获取数据库最新的状态,实施性比较强,一般适用于数据量比较大,数据更新比较频繁的场景

        逻辑分页:

        一次性把全部的数据取出来,通过程序进行筛选数据。如果数据量大的情况下会消耗大量的内存,由于逻辑分页只需要读取数据库一次,不能获取数据库最新状态,实施性比较差,适用于数据量小,数据稳定的场合。

二、分页处理方式

2.1、MybatisPageHelper组件

        常用的分页组件有MybatisPageHelper等,分页原理为先执行原SQL+limit语句,再执行select count(*) from xxx where xxx语句。

        一共执行了两次,进行了两次数据的筛选和过滤

2.1.1、MybatisPlusConfig配置

创建MybatisPlusConfig配置类,需要配置分页插件,小编使用的Spring boot配置方式。

/*** @Auther: IT贱男* @Date: 2019/6/12 15:06* @Description: MybatisPlus配置类*/
@Configuration
public class MyBatisPlusConfig {/*** 分页插件* @return*/@Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}
}


2.1.2、具体分页实现

MP的Wrapper提供了两种分页查询的方式,源码如下:

 /*** 根据 entity 条件,查询全部记录(并翻页)** @param page         分页查询条件(可以为 RowBounds.DEFAULT)* @param queryWrapper 实体对象封装操作类(可以为 null)*/IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);/*** 根据 Wrapper 条件,查询全部记录(并翻页)** @param page         分页查询条件* @param queryWrapper 实体对象封装操作类*/IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

可见两个分页方法参数都是一致的,只是返回参数略有不同,具体选择根据实际业务为准。

  /*** 分页查询*/@Testpublic void selectByPage() {QueryWrapper<User> wrapper = new QueryWrapper();wrapper.like("name", "雨").lt("age", 40);Page<User> page = new Page<>(1,2);//IPage<User> userIPage = userMapper.selectPage(page, wrapper);IPage<Map<String, Object>> mapIPage = userMapper.selectMapsPage(page, wrapper);System.out.println("总页数"+mapIPage.getPages());System.out.println("总记录数"+mapIPage.getTotal());List<Map<String, Object>> records = mapIPage.getRecords();records.forEach(System.out::println);}

以上分页查询执行sql如下,先是查询了一次总记录数,然后在查询的数据。

DEBUG==>  Preparing: SELECT COUNT(1) FROM user WHERE name LIKE ? AND age < ? 
DEBUG==> Parameters: %雨%(String), 40(Integer)
TRACE<==    Columns: COUNT(1)
TRACE<==        Row: 2
DEBUG==>  Preparing: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ? LIMIT ?,? 
DEBUG==> Parameters: %雨%(String), 40(Integer), 0(Long), 2(Long)
TRACE<==    Columns: id, name, age, email, manager_id, create_time
TRACE<==        Row: 2, 张雨琪, 31, zjq@baomidou.com, 1088248166370832385, 2019-01-14 09:15:15
TRACE<==        Row: 3, 刘红雨, 31, lhm@baomidou.com, 1088248166370832385, 2019-01-14 09:48:16
DEBUG<==      Total: 2
总页数1
总记录数2

可以看出,质量量两条查询语句:

  • SELECT COUNT(1) FROM user WHERE name LIKE ? AND age < ?
  • SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ? LIMIT ?,?

2.2 mysql SQL_CALC_FOUND_ROWS & FOUND_ROWS

        可以使用MySQL “SQL_CALC_FOUND_ROWS & FOUND_ROWS()” ,只需进行一次数据的筛选和过滤。(FOUND_ROWS()函数用于统计limit之前查找到的行数)。

2.2.1 例子

实际项目中使用
(1)UserMapper.xml

<resultMap type="com.sys.entity.User" id="UserResult"><id     property="userId"       column="user_id"      /><result property="deptId"       column="dept_id"      /><result property="userName"     column="user_name"    /><result property="nickName"     column="nick_name"    /><result property="roleIds"     column="role_ids"    /><result property="password"     column="password"     /><result property="createBy"     column="create_by"    /><result property="createTime"   column="create_time"  /><result property="updateBy"     column="update_by"    /><result property="updateTime"   column="update_time"  /><result property="remark"       column="remark"       />
</resultMap><resultMap type="java.lang.Integer" id="count"><result column="total"/>
</resultMap><select id="selectList" resultMap="UserResult,count">SELECT SQL_CALC_FOUND_ROWS a.user_id,a.user_name,a.nick_name,dept_name ,c.role_nameFROM sys_user aLEFT JOIN sys_dept b on a.dept_id=b.dept_idLEFT JOIN sys_role c on a.role_ids=c.role_id<where><if test="userName != null and userName != ''">AND u.user_name like concat('%', #{userName}, '%')</if><if test="deptName != null and deptName != ''">AND d.dept_name like concat('%', #{deptName}, '%')</if></where>order by create_time descLIMIT ${pageSize * (pageNum-1)},${pageSize};SELECT FOUND_ROWS() AS total;
</select>


(2)UserMapper.java

List<Object> selectList(@Param("pageSize") Integer pageSize,@Param("pageNum") Integer pageNum,@Param("userName") String userName,@Param("deptName") String deptName);


(3)UserService.java

public List<Object> selectList(Integer pageSize,Integer pageNum,String userName,String deptName) {return userMapper.selectList(pageSize,pageNum,userName,deptName);
}


(4)UserController.java

/*** 获取用户列表* @return 用户列表*/@GetMapping("/list")public ResultVo list(Integer pageSize, Integer pageNum,String userName,String deptName){List<Object> objList = userService.selectList(pageSize, pageNum, userName,deptName);List<User> list = (List<User>) objList.get(0);int count = ((List<Integer>) objList.get(1)).get(0);//总数Page<User> page = new Page<>(pageSize, pageNum);page.setSize(pageSize);page.setCurrent(pageNum);page.setTotal(count);//计算分页总页数page.setPages(count %10 == 0 ? count/10 :count/10+1);page.setRecords(list);return ResultVoUtil.success(page);}


最后,还需要在yml或propertis配置文件中,配置数据库连接池那里,在 url 中,加上 allowMultiQueries=true
 

2.3、mysql-mybatis-pagination组件

        mysql-mybatis-pagination是一个基于MySQL方言 “SQL_CALC_FOUND_ROWS & FOUND_ROWS()” 的轻量级分页组件。

<dependency><groupId>io.github.flashvayne</groupId><artifactId>mysql-mybatis-pagination</artifactId><version>1.0.1</version>
</dependency>

        项目github地址:mysql-mybatis-pagination

MySQL分页组件mysql-mybatis-pagination|Springboot|Mybatis | Vayne的博客

三、参考

MyBatis或MyBatis-plus中分页查询同时查询数据和总数量_mybatisplus分页查询到的总数据量-CSDN博客

MySQL分页组件mysql-mybatis-pagination|Springboot|Mybatis | Vayne的博客

Mybatis分页查询和总条数避免查询两次的方法 - 简书

https://www.cnblogs.com/FlyGoldfish/articles/16615357.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/615564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element-ui 如何修改el-popconfirm的样式

改造之前效果 改造之后效果 代码&#xff1a; <style lang"scss"> .my-popconfirm {width: 92% !important;height: 130px !important;padding: 14px !important;font-size: 28px !important;.el-popper {font-size: 28px !important;}.el-popconfirm__main {…

【RabbitMQ】RabbitMQ高级:如何保证消息可靠性

目录 概述异常捕获机制事务机制持久化存储机制发送端确认机制概述开启发布确认的方法单个发布确认批量发布确认异步发布确认 消费端确认机制消息限流消息幂等性处理 概述 前面学习了如何简单使用RabbitMQ&#xff0c;在实际使用RabbitMQ时&#xff0c;我们还需要考虑很多&…

MySQL-外键等信息

38. 基础-多表查询-概述_哔哩哔哩_bilibili 1、流程函数 2、约束字段 删除外键 &#xff1a; alter table emp2 drop foreign key 外键名 //外键可以保持数据的一致性和完整性&#xff0c;外键的话&#xff0c;就是类似一个主表&#xff0c;一个从表&#xff0c;从表的其中一…

ROS2入门之节点与指令

文章目录 前言一、初识ROS21.ROS简介2.ROS系统框架 二、ROS2创建节点(CPP)1.创建工作空间2.创建功能包3.创建节点4.配置CMakeLists5.编译运行节点&#x1f353;编译节点&#x1f34a;source环境&#x1f34e; 运行节点 报错解决 三、ROS2常用指令1.ros2 pkg create2.ros2 pkg l…

mac 使用brew卸载node

1.查看当前的node版本 node -v 2.查看使用brew 安装的版本&#xff0c;可以看到本机装了14、16、18版本的node brew search node 3.卸载node brew uninstall node版本号 --force 如分别删除14、16、18版本的node命令如下 brew uninstall node14 --force brew uninstall no…

使用AutoDL云计算平台训练并测试Pytorch版本NeRF代码

文章目录 前言一、数据集及代码获取二、租用并设置服务器三、Pycharm远程开发四、训练并测试代码 前言 因为第一次在云服务器上跑代码&#xff0c;所以在这里记录一下。 一、数据集及代码获取 nerf-pytorch项目是 NeRF 的忠实 PyTorch 实现&#xff0c;它在运行速度提高 1.3 倍…

PLM系统功能、彩虹PLM系统功能、产品数据管理系统

彩虹PLM系统的功能 产品数据管理 产品数据管理是 PLM 系统的核心功能之一&#xff0c;它主要包括以下几个方面&#xff1a; &#xff08;1&#xff09;数据存储&#xff1a;将产品的设计数据&#xff08;如 CAD 模型、图纸、BOM 等&#xff09;存储在统一的数据库中&#xf…

springmvc内嵌tomcat、tomcat整合springmvc、自研国产web中间件

springmvc内嵌tomcat、tomcat整合springmvc、自研国产web中间件 这是由于公司老项目转化springboot存在太多坑&#xff0c;特别是hibernate事务一条就坑到跑路&#xff0c;你又不想搞没听说过的国产中间件兼容&#xff0c;又不想搞weblogic、WebSphere等中间件的适配&#xff…

Gitlab中的CICD的使用方法

一、CI/CD执行机制 二、离线安装gitlab-runner 下载相应版本的gitlab-runner &#xff08;下载地址&#xff1a;https://packages.gitlab.com/runner/gitlab-runner&#xff09; dpkg -i gitlab-runner_12.8.0_amd64.debgitlab-runner register第3步中需要的信息可从下图所示…

AMEYA360报导:瑞萨宣布收购Transphorm,大举进军GaN

全球半导体解决方案供应商瑞萨电子与全球氮化镓(GaN)功率半导体供应商Transphorm, Inc.(以下“Transphorm”)于今天宣布双方已达成最终协议&#xff0c;根据该协议&#xff0c;瑞萨子公司将以每股5.10美元现金收购Transphorm所有已发行普通股&#xff0c;较Transphorm在2024年1…

Next.js 学习笔记(六)——缓存

缓存 Next.js 可通过缓存渲染工作和数据请求来提高应用程序的性能并降低成本。本页将深入介绍 Next.js 缓存机制、可用于配置这些机制的 API 以及它们之间的交互方式。 需要知道&#xff1a;本页将帮助你了解 Next.js 的工作原理&#xff0c;但这并不是使用 Next.js 提高工作效…

【VMware】Windows部署单机OA项目---图文并茂详细讲解

目录 一 准备工作 二 安装JDK 三 tomcat安装 ​四 MySQL安装 ①解压MySQL压缩包 ②my文件拷贝mysql安装根目录下 ③ 修改my文件 ④ 安装MySQL 4.1 注册mysql服务 4.2 初始化 4.3 启动MySQL 4.4 登入MySQL 4.5 修改默认的MySQL密码 五 连接MySQL 5.1 虚拟机连接MyS…

LeetCode——2645. 构造有效字符串的最少插入数

通过万岁&#xff01;&#xff01;&#xff01; 题目&#xff1a;给你一个只会有a、b、c三个字母构成的字符串word&#xff0c;然后让你在任意位置添加a、b、c三个字母&#xff0c;使得word变成全都由abc这个字符串拼接而成的字符串。问最少需要插入多少次字母。思路&#xff…

Eclipse、IntelliJ IDEA、PyCharm三种IDE的区别

Eclipse、IntelliJ IDEA和PyCharm是三种流行的集成开发环境&#xff08;IDE&#xff09;&#xff0c;每个都有其特性和优点。 1.Eclipse&#xff1a;Eclipse是一款开源的Java IDE&#xff0c;由Eclipse基金会开发。它具有许多功能&#xff0c;包括代码自动完成、调试、源代码控…

便携式灯具的UL测试标准UL153介绍

UL153标准&#xff1a;UL153标准主要是描述有关使用电源线及插头作为连接工具,使用120伏电压,15或20安培的电源,并符合美国国家电器规范的便携灯.此标准也适用于那些不用插头,而用一些兼容的接线端作为连接工具的便携灯&#xff0c;同时对于使用非120伏电压&#xff0c;15or20安…

计算机毕业设计——SpringBoot仓库管理系统(附源码)

1&#xff0c;绪论 1.2&#xff0c;项目背景 随着电子计算机技术和信息网络技术的发明和应用&#xff0c;使着人类社会从工业经济时代向知识经济时代发展。在这个知识经济时代里&#xff0c;仓库管理系统将会成为企业生产以及运作不可缺少的管理工具。这个仓库管理系统是由&a…

六西格玛绿带培训——实现完美操作的关键工具

当我们谈论六西格玛&#xff0c;我们不仅仅谈论一个管理工具或是企业流程改进的方法。我们谈的是一种愿景——实现几乎完美的操作。在SpaceX、在Tesla&#xff0c;我们每天努力实现这种精确度&#xff0c;因为即使是一丝一毫的疏漏&#xff0c;都可能成为我们星际野望无情的噩梦…

滑动条QSlider和进度条QProgressBar

1. 滑动条&#xff1a;QSlider 实例化 //实例化1 // QSlider* slider new QSlider(this);QSlider* slider new QSlider(Qt::Horizontal,this);//第一个参数使摆放方式2.1滑动条的基本函数 滑动条刻度的 位置 参数 QSlider::NoTicks //不要画任何标记 QSlider::TicksBoth…

Android 车联网——CarInputService介绍(十七)

除了前面介绍的 Service 和 Manager 之外,CarService 中还提供了很多其他 Service 和 Manager。 一、CarInputService 1、简介 CarInputService 是一个安卓汽车平台中的服务,它负责处理与车辆输入设备相关的操作,例如处理车辆上的按钮、方向盘控制、触摸屏输入等。…

在矩阵回溯中进行累加和比较的注意点

1 总结 在回溯时&#xff0c;如果递归函数采用void返回&#xff0c;在入口处使用了sum变量&#xff0c;那么一般在初次调用dfs的地方&#xff0c;这个sum的初始值可能不是0,而是数组的对应指针的值&#xff0c;在比较操作的时候&#xff0c;需要在for循环开始之前进行&#xf…