在实际开发中,对于大量数据的查询,可以通过分页查询的方式来减少查询量和提高查询效率。在 MyBatis-Plus 中,分页查询可以通过使用 Page 对象和 IService 接口提供的分页方法来实现。MyBatis-Plus 的分页插件 PaginationInnerInterceptor 提供了强大的分页功能,支持多种数据库,使得分页查询变得简单高效。
官方文档:《MyBatis-Plus 分页插件》
Page 类的说明:
Page 类继承了 IPage 类,实现了简单分页模型。如果你需要实现自己的分页模型,可以继承 Page 类或实现 IPage 类。
属性名 | 类型 | 默认值 | 描述 |
---|---|---|---|
records | List<T> | emptyList | 查询数据列表 |
total | Long | 0 | 查询列表总记录数 |
size | Long | 10 | 每页显示条数,默认 10 |
current | Long | 1 | 当前页 |
orders | List<OrderItem> | emptyList | 排序字段信息 |
optimizeCountSql | boolean | true | 自动优化 COUNT SQL |
optimizeJoinOfCountSql | boolean | true | 自动优化 COUNT SQL 是否把 join 查询部分移除 |
searchCount | boolean | true | 是否进行 count 查询 |
maxLimit | Long | 单页分页条数限制 | |
countId | String | XML 自定义 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&&serverTimezone=UTC
username: root
password: 123456
driver-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配置类)。
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
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
2.2 创建实体类(Entity层)
在 com.pjb.pm.entity 包中,创建 UserInfo 类(用户信息实体类)。
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;
@Override
public String toString()
{
return "编号:" + this.getUserId() +" 姓名:" + this.getUserName() + " 省份:" + this.getProvince();
}
}
2.3 创建模型类(model层)
(1)在 com.pjb.pm.model 包中,创建 BasePaging 类(公共分页类)。
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 类(公共分页类)。
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 接口。
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 类。
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
{
/**
* 分页查询用户列表
*/
@Override
public 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条数据,并根据创建时间排序。
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
{
@Autowired
private IUserService userService;
/**
* 分页查询用户列表
* @author pan_junbiao
*/
@Test
public 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");
}
}
执行结果:
标签:分页,博客,junbiao,Plus,MyBatis,import,pjb,com,pan From: https://blog.csdn.net/pan_junbiao/article/details/142616533