MyBatis-Plus分页查询

devtools/2024/10/18 18:15:23/

在实际开发中,对于大量数据的查询,可以通过分页查询的方式来减少查询量和提高查询效率。在 MyBatis-Plus 中,分页查询可以通过使用 Page 对象和 IService 接口提供的分页方法来实现。MyBatis-Plus 的分页插件 PaginationInnerInterceptor 提供了强大的分页功能,支持多种数据库,使得分页查询变得简单高效。

官方文档:《MyBatis-Plus 分页插件》

Page 类的说明:

Page 类继承了 IPage 类,实现了简单分页模型。如果你需要实现自己的分页模型,可以继承 Page 类或实现 IPage 类。 

属性名类型默认值描述
recordsList<T>emptyList查询数据列表
totalLong0查询列表总记录数
sizeLong10每页显示条数,默认 10
currentLong1当前页
ordersList<OrderItem>emptyList排序字段信息
optimizeCountSqlbooleantrue自动优化 COUNT SQL
optimizeJoinOfCountSqlbooleantrue自动优化 COUNT SQL 是否把 join 查询部分移除
searchCountbooleantrue是否进行 count 查询
maxLimitLong单页分页条数限制
countIdStringXML 自定义 count 查询的 statementId

通过这些配置和使用方法,你可以轻松地在 MyBatis-Plus 中实现分页查询,提高应用的性能和用户体验。

【实例】SpringBoot 整合 MyBatis-Plus 实现分页查询,并显示分页信息。执行效果如下图:

1、创建数据表

在MySQL数据库中创建用户信息表(tb_user),并添加数据。

-- 创建数据库
CREATE DATABASE IF NOT EXISTS db_admin;-- 使用数据库
USE db_admin;-- 判断数据表是否存在,存在则删除
DROP TABLE IF EXISTS tb_user;-- 创建“用户信息”数据表
CREATE TABLE IF NOT EXISTS tb_user
( user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号',user_name VARCHAR(50) NOT NULL COMMENT '用户姓名',province VARCHAR(50) NOT NULL COMMENT '省份',create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间'
) COMMENT = '用户信息表';-- 添加数据
INSERT INTO tb_user(user_name,province) VALUES
('pan_junbiao的博客_01','广东省'),('pan_junbiao的博客_02','黑龙江省'),('pan_junbiao的博客_03','山东省'),('pan_junbiao的博客_04','安徽省'),('pan_junbiao的博客_05','黑龙江省'),
('pan_junbiao的博客_06','江苏省'),('pan_junbiao的博客_07','黑龙江省'),('pan_junbiao的博客_08','广东省'),('pan_junbiao的博客_09','陕西省'),('pan_junbiao的博客_10','广东省'),
('pan_junbiao的博客_11','广东省'),('pan_junbiao的博客_12','江苏省'),('pan_junbiao的博客_13','陕西省'),('pan_junbiao的博客_14','安徽省'),('pan_junbiao的博客_15','山东省'),
('pan_junbiao的博客_16','陕西省'),('pan_junbiao的博客_17','安徽省'),('pan_junbiao的博客_18','江苏省'),('pan_junbiao的博客_19','黑龙江省'),('pan_junbiao的博客_20','安徽省'),
('pan_junbiao的博客_21','江苏省'),('pan_junbiao的博客_22','广东省'),('pan_junbiao的博客_23','安徽省'),('pan_junbiao的博客_24','陕西省'),('pan_junbiao的博客_25','广东省'),
('pan_junbiao的博客_26','广东省'),('pan_junbiao的博客_27','安徽省'),('pan_junbiao的博客_28','山东省'),('pan_junbiao的博客_29','山东省'),('pan_junbiao的博客_30','黑龙江省'),
('pan_junbiao的博客_31','广东省'),('pan_junbiao的博客_32','江苏省'),('pan_junbiao的博客_33','陕西省'),('pan_junbiao的博客_34','安徽省'),('pan_junbiao的博客_35','山东省');-- 查询数据
SELECT * FROM tb_user;

2、创建项目

(1)创建 SpringBoot 项目,项目结构如下图:

(2)添加 Maven 依赖

在 pom.xml 配置文件中添加 MyBatis-Plus、 MySQL 的 JDBC 数据库驱动、Lombok 插件等依赖。

<!-- MyBatis-Plus 依赖 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.7</version>
</dependency><!-- MySQL的JDBC数据库驱动 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version>
</dependency><!-- Lombok 依赖 -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.34</version><scope>provided</scope>
</dependency>

(3)配置相关信息

将默认的 application.properties 文件的后缀修改为“.yml”,即配置文件名称为:application.yml,并配置以下信息:

#Spring配置
spring:application:#项目名称name: ProjectManagement#DataSource数据源datasource:url: jdbc:mysql://localhost:3306/db_admin?useSSL=false&amp&serverTimezone=UTCusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver#MybatisPlus配置
mybatis-plus:configuration:#配置日志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2.1 创建配置类(Config层)

在 com.pjb.pm.config 包中,创建 MybatisPlusConfig 类(MybatisPlus配置类)。

java">package com.pjb.pm.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** MybatisPlus配置类* @author pan_junbiao**/
@Configuration
public class MybatisPlusConfig
{/*** 新增分页拦截器,并设置数据库类型为 mysql*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}

2.2 创建实体类(Entity层)

在 com.pjb.pm.entity 包中,创建 UserInfo 类(用户信息实体类)。

java">package com.pjb.pm.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.time.LocalDate;/*** 用户信息实体类* @author pan_junbiao**/
@Data
@TableName("tb_user") //设置数据表名
public class UserInfo
{/*** 用户编号(主键、自增)*/@TableId(type = IdType.AUTO) //主键生成策略:自增private Long userId;/*** 用户姓名*/private String userName;/*** 省份*/private String province;/*** 注册时间*/private LocalDate createTime;@Overridepublic String toString(){return "编号:" + this.getUserId() +" 姓名:" + this.getUserName() + " 省份:" + this.getProvince();}
}

2.3 创建模型类(model层)

(1)在 com.pjb.pm.model 包中,创建 BasePaging 类(公共分页类)。

java">package com.pjb.pm.model;import lombok.Data;/*** 公共分页类* @author pan_junbiao**/
@Data
public class BasePaging
{/*** 当前页码*/private int pageIndex;/*** 分页大小*/private int pageSize;/*** 排序*/private String orderBy;
}

(2)在 com.pjb.pm.model 包中,创建 UserSearchParam 类(用户查询参数类),并继承 BasePaging 类(公共分页类)。

java">package com.pjb.pm.model;import lombok.Data;/*** 用户查询参数类* @author pan_junbiao**/
@Data
public class UserSearchParam extends BasePaging
{/*** 用户姓名*/private String userName;/*** 省份*/private String province;
}

2.4 业务逻辑层(Service层)

在 com.pjb.pm.service 包下,创建 UserService 接口(用户信息服务接口),并继承 IService 接口。

java">package com.pjb.pm.service;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.pjb.pm.entity.UserInfo;
import com.pjb.pm.model.UserSearchParam;/*** 用户信息服务接口* @author pan_junbiao**/
public interface IUserService extends IService<UserInfo>
{/*** 分页查询用户列表*/Page<UserInfo> getUserPage(UserSearchParam searchParam);
}

在 com.pjb.pm.service.impl 包下,创建 UserServiceImpl 类(用户信息服务类),并继承 ServiceImpl 类。

java">package com.pjb.pm.service.impl;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pjb.pm.entity.UserInfo;
import com.pjb.pm.mapper.UserMapper;
import com.pjb.pm.model.UserSearchParam;
import com.pjb.pm.service.IUserService;
import org.springframework.stereotype.Service;/*** 用户信息服务类* @author pan_junbiao**/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, UserInfo> implements IUserService
{/*** 分页查询用户列表*/@Overridepublic Page<UserInfo> getUserPage(UserSearchParam searchParam){//分页参数Page<UserInfo> rowPage = new Page(searchParam.getPageIndex(), searchParam.getPageSize());//查询条件LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();if(StringUtils.isNotEmpty(searchParam.getUserName())){queryWrapper.like(UserInfo::getUserName,searchParam.getUserName());}if(StringUtils.isNotEmpty(searchParam.getProvince())){queryWrapper.eq(UserInfo::getProvince,searchParam.getProvince());}//排序queryWrapper.orderByAsc(UserInfo::getCreateTime);//分页查询rowPage = this.baseMapper.selectPage(rowPage, queryWrapper);return rowPage;}
}

3、运行测试

【运行】查询第2页的用户数据,每页10条数据,并根据创建时间排序。

java">package com.pjb.pm;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pjb.pm.entity.UserInfo;
import com.pjb.pm.model.UserSearchParam;
import com.pjb.pm.service.IUserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;/*** 用户业务逻辑测试类(JUnit5)* @author pan_junbiao**/
@SpringBootTest
public class UserServiceTest
{@Autowiredprivate IUserService userService;/*** 分页查询用户列表* @author pan_junbiao*/@Testpublic void searchUserByParam(){//分页信息UserSearchParam searchParam = new UserSearchParam();searchParam.setPageIndex(2); //查询第2页码searchParam.setPageSize(10); //每页10条数据//searchParam.setUserName("pan_junbiao的博客"); //查询条件1//searchParam.setProvince("广东省"); //查询条件2//执行分页查询Page<UserInfo> userInfoPage = userService.getUserPage(searchParam);//打印用户列表System.out.println("\n");List<UserInfo> userInfoList = userInfoPage.getRecords();userInfoList.stream().forEach(System.out::println);//打印分页信息System.out.println("当前页码:第" + userInfoPage.getCurrent() + "页");System.out.println("分页大小:每页" + userInfoPage.getSize() + "条");System.out.println("数据总数:共" + userInfoPage.getTotal() + "条");System.out.println("总页数:共" + userInfoPage.getPages() + "页\n");}
}

执行结果:


http://www.ppmy.cn/devtools/118360.html

相关文章

华为云技术深度解析:Flexus X实例与GitLab的云端协作实践

华为云技术深度解析:Flexus X实例与GitLab的云端协作实践 在当今数字化转型的浪潮中,企业如何快速响应市场变化,提升业务敏捷性和效率,成为了关键议题。华为云作为业界领先的云服务提供商,通过不断的技术创新,为企业提供了强有力的支撑。本文将深入探讨华为云Flexus X实…

OpenCV视频I/O(6)检查视频捕获对象是否已成功打开的函数isOpened()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 如果视频捕获已经初始化&#xff0c;则返回 true。 如果之前调用 VideoCapture 构造函数或 VideoCapture::open() 成功&#xff0c;则该方法返回…

解决uniapp使用up-form组件,uView提示:未设置rules,请看文档说明!如果已经设置,请刷新页面。

up-form组件 :model“formData” :rules“rules” rules中的属性在formData要赋初始值&#xff0c;比如下面的例子 表单样式 <up-form labelPosition"top" labelWidth"auto" :labelStyle"{ color: #333333 }" :model"formData":rul…

Mysql高级篇(中)——锁机制

锁机制 一、概述二、分类1、读锁2、写锁⭐、FOR SHARE / FOR UPDATE&#xff08;1&#xff09;NOWAIT&#xff08;2&#xff09;SKIP LOCKED&#xff08;3&#xff09;NOWAIT 和 SKIP LOCKED 的比较 ⭐、 脏写3、表级锁之 S锁 / X锁&#xff08;1&#xff09;总结&#xff08;2…

基于飞腾平台的OpenCV的编译与安装

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力&#xff0c;聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域&#xff0c;包含了应用使能套件、软件仓库、软件支持、软件适…

光伏发电生活废水处理设备产地货源

诸城市鑫淼环保小编带大家了解一下光伏发电生活废水处理设备产地货源 由A级生化厌氧池、二级O级生化好氧池、污泥浓缩池、清水排放池和人孔&#xff08;观察孔&#xff09;组成。工厂直接供应地埋式一体化污水处理设备&#xff0c;经济实用&#xff0c;节省设备投资和设备运行费…

centos安装nginx指定pcre位置

载PCRE源码。您可以从PCRE的官方网站&#xff08;https://www.pcre.org/&#xff09;获取最新版本的源码。例如&#xff0c;如果您要安装PCRE 8.44&#xff0c;可以使用以下命令下载并解压 wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz tar -zxvf pcre-8.44.tar.gz编…

基于STM32和FPGA的射频数据采集系统设计流程

一、项目概述 高速采集射频&#xff08;RF&#xff09;信号是一个关键的需求。本文旨在设计一种基于STM32和FPGA的射频数据采集系统&#xff0c;以实现对接收到的射频信号的高精度和高速度的处理。该系统适用于无线通信、信号分析、雷达系统等应用场景。 技术栈关键词&#x…