SpringBoot 结合 mybatis-plus 实现分页功能

这篇具有很好参考价值的文章主要介绍了SpringBoot 结合 mybatis-plus 实现分页功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、分页的原理        

        要实现分页功能方法有很多,但最基本的实现原理都差不多,所以在实现功能之前要先把原理搞明白。正如删除有 “逻辑删除”  和 “物理删除" 之分,分页也有 “逻辑分页” 和 “物理分页”;

1、逻辑分页:逻辑分页依赖于代码。(Mybatis自带的分页插件就是逻辑分页)
逻辑分页是先查询出所有的数据(只需要访问一次数据库),再根据代码块的所需  (你需要拿到第几页,每页几条的数据) 筛选出合适的数据进行分页。
2、物理分页:物理分页依赖于数据库。(更侧重于sql语句)
MySQL数据库提供的分页关键字"LIMIT ",程序员只需要编写带有关键字的SQL语句,数据库返回的数据就是分页结果。(每次都要访问数据库,对数据库造成的负担大)

        但我们一般不推荐使用逻辑分页,而使用物理分页较多,因为  “逻辑分页一次性将所有的数据读取至内存中,占用了较大的内存空间;物理分页每次只读取所需的数据,占用内存比较小” 。而在使用物理分页的时候,就要考虑到limit的用法。 

mysql的limit用法、逻辑分页和物理分页

详解Mybatis-Plus中分页插件PaginationInterceptor

二、利用 mybatis-plus 自带分页插件Interceptor实现分页功能

        MyBatis-Plus 自带的分页插件 PaginationInterceptor 就是基于物理分页实现的。该插件会拦截 SQL 执行过程中的分页参数(如 Page 对象),并根据传入的分页参数自动生成对应的 LIMIT 或者 ROWS 等分页语句,从而达到物理分页的效果。同时,PaginationInterceptor 还支持多租户和动态表名等功能。需要注意的是,如果查询条件中包含了 GROUP BY 子句,物理分页可能会出现问题,因为 LIMIT 或者 ROWS 可能会影响 GROUP BY 的结果。如果需要进行分组查询,建议使用逻辑分页或者在应用层手动处理分页结果。

SpringBoot 结合 mybatis-plus 实现分页功能

SpringBoot 结合 mybatis-plus 实现分页功能

下面演示按照 “性别” 进行分页,以下是具体步骤:

1、在pom.xml文件中添加依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.2</version>
</dependency>

2、在配置文件application.properties或application.yml中进行PageHelper的配置:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true

server:
  port: 9090

mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  # 控制台打印sql语句
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3、创建测试数据库表

create table user
(
	id int(20) auto_increment comment 'id',
	username varchar(20) null comment '用户名',
	gender tinyint null comment '''0未知 1男 2女',
	password varchar(32) null comment '密码',
	age int(4) null comment '年龄',
	create_time datetime null comment '创建时间',
	constraint user_pk
	primary key (id)
)
comment '测试用户表';

 SpringBoot 结合 mybatis-plus 实现分页功能

 4、创建对应测试实体类

@Data
@TableName(value = "user")
public class UserEntity{

    /**
     * id
     */
    @TableId
    private Long id;

    /**
     * 用户名
     */
    private String username;

    /**
     * 密码
     */
    private String password;

    /**
     * 0未知 1男 2女
     */
    private Integer gender;

    /**
     * 年龄
     */
    private Integer age;
}

5、设置配置类

@Configuration
public class MybatisPlusConfig{

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        paginationInnerInterceptor.setOptimizeJoin(true);
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        paginationInnerInterceptor.setOverflow(true);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor = new OptimisticLockerInnerInterceptor();
        interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor);
        return interceptor;
    }

}

6、 设置xml文件(针对按条件的复杂条件分页情况)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demoutils.easyexcel.mapper.UserMapper">
    <sql id = "entity">
        a.id,a.username,a.password,a.gender,a.age,a.create_time
    </sql>
    <select id="selectUserByGender" resultType="com.example.demoutils.easyexcel.entity.UserEntity">
        select <include refid="entity"/> from user a
        <where>
            <if test="gender != null">
                and a.gender = #{gender}
            </if>
        </where>
    </select>
</mapper>

7、设置mapper 文件

SpringBoot 结合 mybatis-plus 实现分页功能

8、设置 service 层文件(不用再写service实现层了,一个搞定,当然你分开写也可以)

SpringBoot 结合 mybatis-plus 实现分页功能

 9、设置 controller 层文件

SpringBoot 结合 mybatis-plus 实现分页功能

 10、运行结果

SpringBoot 结合 mybatis-plus 实现分页功能

SpringBoot 结合 mybatis-plus 实现分页功能

三、需要注意的地方:

MyBatis-Plus 中的 Page 和 IPage 接口都是用于封装分页参数和返回分页结果的。它们的主要区别在于 Page 是 IPage 的实现类,而 IPage 是一个更加抽象的分页接口。

具体来说,IPage 接口是对分页参数进行抽象的接口,它包含了以下几个方法:

  • getCurrent():获取当前页码
  • getSize():获取每页显示的记录数
  • getTotal():获取总记录数
  • getRecords():获取当前页的结果集
  • setRecords(List<T> records):设置当前页的结果集
  • setTotal(long total):设置总记录数

而 Page 类则是 IPage 接口的默认实现类,它的构造函数可以传入当前页码和每页显示的记录数等参数,并且还包含了一些方便进行物理分页操作的方法,如:

  • setAsc(String... ascs):设置按照哪些字段升序排列
  • setDesc(String... descs):设置按照哪些字段降序排列
  • convert(Function<? super T, ? extends U> mapper):转换当前页的结果集
  • optimizeCountSql(boolean isOptimize):是否启用 count sql 最优化(默认 true)
  • optimizeJoin(boolean isOptimize):是否为 join 语句 count 优化(默认 false)

因此,如果只需要进行简单的物理分页操作,可以直接使用 Page 类,而如果需要对分页参数进行更多的自定义操作,也可以使用 IPage 接口。

如刚才的例子换用 Page 接口 也是一样的

SpringBoot 结合 mybatis-plus 实现分页功能

SpringBoot 结合 mybatis-plus 实现分页功能 文章来源地址https://www.toymoban.com/news/detail-463345.html

到了这里,关于SpringBoot 结合 mybatis-plus 实现分页功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mybatis-plus分页查询(springboot中实现单表和多表查询)

    一、mybatis-plus单表查询 使用mybatis-plus实现单表分页查询 非常方便,主要操作步骤如下: 配置分页查询拦截器 进行分页查询 1.首先,打开mybatis-plus官网的插件(插件主体) 或者点击mybatis-plus插件 我是配置在springboot项目中,所以找到springboot的分页配置 2.配置分页查询拦截器

    2024年02月08日
    浏览(32)
  • MyBatis-Plus 实现分页的几种写法

    MyBatis-Plus (opens new window) (简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 无侵入 :只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小 :启动即会自动注入基本 CURD,性能基本无损

    2024年01月20日
    浏览(35)
  • SpringBoot+Mybatis-Plus+Thymeleaf+Bootstrap分页查询(前后端完整版开源学习)图书管理系统

    Mybatis-Plus | Spring Boot+Mybatis-Plus+Thymeleaf+Bootstrap分页页查询(前后端都有) 主要参考了这篇博客。 运行截图 3.9.1 mybatis-plus 插入时间和更新时间字段自动填充工具 3.9.2 分页插件工具

    2023年04月11日
    浏览(33)
  • mybatis-plus分页total为0,分页失效,mybatis-plus多租户插件使用

    背景:项目使用mybatis分页插件不生效,以及多租户使用时读取配置异常 多租户插件使用遇到的问题: 最开始在MyTenantLineHandler中使用 @Value(\\\"${tables}\\\"),服务启动时能从配置中心拉取到配置,但在运行时获取到的值为空,试了很多方法都不生效,后面将配置中心的配置在调用My

    2024年02月06日
    浏览(41)
  • mybatis-plus分页方式

    概述 MyBatisPlus中提供的(自带的)分页插件,非常简单,只需要简单的配置就可以实现分页功能。 详细步骤: 第一步::config.MybatisPlusConfig.java:配置类,配置mybatisplus的插件功能。 第二步:验证(测试): 官网介绍: IXxxService.java: XxxServiceImpl.java: XxxController.java 业务(

    2024年02月16日
    浏览(33)
  • Mybatis-Plus手动分页

     TableDataInfo  serviceImpl.selectPageQueryUserList

    2024年02月11日
    浏览(30)
  • MyBatis与MyBatis-Plus的分页以及转换

    MyBatis和MyBatis-Plus都是Java持久化框架,用于简化数据库访问和操作。它们提供了面向对象的方式来管理关系型数据库中的数据。 MyBatis 是一个轻量级的持久化框架,通过XML或注解配置,将SQL语句与Java对象进行映射,使开发者可以使用简单的API来执行数据库操作。MyBatis支持动态

    2024年02月11日
    浏览(44)
  • MyBatis-Plus 分页设置不生效

    在配置类上加拦截器 2.当你设置了数据源需要在数据源上添加拦截器

    2024年02月15日
    浏览(30)
  • Mybatis-Plus学习4 Page分页

    ctrl + P = 查看可填的属性类型  alt + 回车 = 自动填充数据类型 1、使用Page分页需要先配置config类,加上拦截器 type-aliasys-package配置pojo对象别名对应的包 自定义的Mapper的page查询: 乐观锁 和 悲观锁 悲观锁: 悲观锁的思想是,在操作数据之前,先假设其他并发操作会对数据进行

    2024年02月12日
    浏览(33)
  • springboot+mybatis-plus实现自动建表

    好长时间没输出了,最近工作上也是太多事,领导动不动就拍脑门,那叫一个酸爽~ 工作能力的提现不但是技术或解决问题的能力上,还体现在要能立刻满足领导的各种需求,不管是哪方面的需求,这样才能够拍上马屁,步步高升。 言归正传,作为技术从业者,还是要多深耕

    2024年02月16日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包