MyBatis-Plus分页查询

发布于:2024-10-12 ⋅ 阅读:(130) ⋅ 点赞:(0)

在实际开发中,对于大量数据的查询,可以通过分页查询的方式来减少查询量和提高查询效率。在 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&amp&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");
    }
}

执行结果:


网站公告

今日签到

点亮在社区的每一天
去签到