【第29章】MyBatis-Plus之分页插件

文章目录

  • 前言
  • 一、支持的数据库
  • 二、配置方法
  • 三、属性介绍
  • 四、自定义 Mapper 方法中使用分页
  • 五、其他注意事项
  • 六、Page 类
  • 七、实战
    • 1. 配置类
    • 2. 分页类
    • 3. 测试
  • 总结


前言

MyBatis-Plus 的分页插件 PaginationInnerInterceptor 提供了强大的分页功能,支持多种数据库,使得分页查询变得简单高效。


一、支持的数据库

PaginationInnerInterceptor 支持广泛的数据库,包括但不限于:
在这里插入图片描述
如果你需要支持的数据库不在列表中,可以通过 Pull Request 请求添加。
覆盖范围很广,已经支持了众多国产数据库。

二、配置方法

在 Spring Boot 项目中,你可以通过 Java 配置来添加分页插件:

@Configuration
@MapperScan("scan.your.mapper.package")
public class MybatisPlusConfig {/*** 添加分页插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbTypereturn interceptor;}
}

三、属性介绍

PaginationInnerInterceptor 提供了以下属性来定制分页行为:

属性名类型默认值描述
overflowbooleanfalse溢出总页数后是否进行处理
maxLimitLong单页分页条数限制
dbTypeDbType数据库类型
dialectIDialect方言实现类

建议单一数据库类型的均设置 dbType

四、自定义 Mapper 方法中使用分页

你可以通过以下方式在 Mapper 方法中使用分页:

IPage<UserVo> selectPageVo(IPage<?> page, Integer state);
// 或者自定义分页类
MyPage selectPageVo(MyPage page);
// 或者返回 List
List<UserVo> selectPageVo(IPage<UserVo> page, Integer state);

对应的 XML 配置:

<select id="selectPageVo" resultType="xxx.xxx.xxx.UserVo">SELECT id,name FROM user WHERE state=#{state}
</select>

如果返回类型是 IPage,则入参的 IPage 不能为 null。如果想临时不分页,可以在初始化 IPage 时 size 参数传入小于 0 的值。 如果返回类型是 List,则入参的 IPage 可以为 null,但需要手动设置入参的 IPage.setRecords(返回的 List)。 如果 XML 需要从 page 里取值,需要使用 page.属性 获取。

五、其他注意事项

  • 生成 countSql 时,如果 left join 的表不参与 where 条件,会将其优化掉。建议在任何带有 left join 的 SQL 中,都给表和字段加上别名。
  • 在使用多个插件时,请将分页插件放到插件执行链的最后面,以避免 COUNT SQL 执行不准确的问题。

六、Page 类

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

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

七、实战

1. 配置类

package org.example.springboot3.mybatisplus.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;/*** Create by zjg on 2024/7/7*/
@Configuration
public class MybatisPlusConfig {/*** 添加分页插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbTypereturn interceptor;}
}

2. 分页类

package org.example.springboot3.mybatisplus.controller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.example.springboot3.bigevent.entity.Result;
import org.example.springboot3.mybatisplus.model.User;
import org.example.springboot3.mybatisplus.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;/*** Create by zjg on 2024/7/7*/
@RestController
@RequestMapping("/page/")
public class PageController {@AutowiredUserService userService;@GetMappingResult<List<User>> page(@RequestParam Integer pageNum,@RequestParam Integer pageSize, String name) {// 假设有一个 QueryWrapper 对象,进行有条件的分页查询IPage<User> page = new Page<>(pageNum, pageSize);LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery(User.class);if(StringUtils.hasLength(name)){queryWrapper.eq(User::getName, name);}IPage<User> userPage = userService.page(page, queryWrapper); // 调用 page 方法List<User> userList = userPage.getRecords();long total = userPage.getTotal();System.out.println("Total users: " + total);return Result.success("请求成功",userList);}
}

3. 测试

在这里插入图片描述

总结

回到顶部

通过这些配置和使用方法,你可以轻松地在 MyBatis-Plus 中实现分页查询,提高应用的性能和用户体验。
更多插件内容请访问官网

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

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

相关文章

Windows电脑安装Python结合内网穿透轻松搭建可公网访问私有网盘

文章目录 前言1.本地文件服务器搭建1.1.Python的安装和设置1.2.cpolar的安装和注册 2.本地文件服务器的发布2.1.Cpolar云端设置2.2.Cpolar本地设置 3.公网访问测试4.结语 前言 本文主要介绍如何在Windows系统电脑上使用python这样的简单程序语言&#xff0c;在自己的电脑上搭建…

kubernetes授予用户指定命名空间的使用权限

kubernetes授予用户指定命名空间的使用权限 问题描述具体实现签发客户端证书创建RBAC策略生成kubeconfig文件 问题描述 假如我们部门来了个新同事&#xff0c;他需要使用kubernetes集群&#xff0c;但是因为他刚来&#xff0c;还不熟悉&#xff0c;所以不能直接将kubernetes集…

Spring如何控制Bean加载+执行顺序

1. Order 注解和 Ordered 接口 用途&#xff1a;控制组件执行顺序或排序&#xff0c;但不控制Bean初始化顺序。定义执行顺序&#xff1a;通过整数值指定组件优先级&#xff0c;数值越小优先级越高。集合排序&#xff1a;影响自动装配到集合中的组件排列顺序。使用场景&#xf…

77.MySQL的分页查询

一、LIMIT关键字 LIMIT关键字用于限制返回结果集中的行数。其基本语法如下&#xff1a; SELECT * FROM 表名 LIMIT 行数; 例如&#xff0c;要从名为mark_info的表中选择最新创建的10个工单的信息&#xff0c;可以执行以下查询&#xff1a; SELECT * FROM mark_info ORDER B…

电力需求预测挑战赛笔记 Taks1 跑通baseline

#AI夏令营 #Datawhale #夏令营 赛题 一句话介绍赛题任务可以这样理解赛题&#xff1a; 【训练时序预测模型助力电力需求预测】 电力需求的准确预测对于电网的稳定运行、能源的有效管理以及可再生能源的整合至关重要。 赛题任务 给定多个房屋对应电力消耗历史 N 天的相关序列数…

拓扑排序(算法篇)

算法之拓扑排序 拓扑排序 概念&#xff1a; 拓扑排序是对有向无圈图的顶点的一种排序。排序不必是唯一的&#xff0c;任何合理的排序都是可以的。具体做法是&#xff1a;先找出任意一个没有入边的顶点v(就是没有其他顶点指向的顶点)&#xff0c;将顶点v放入队列&#xff0c;…

element-plus el-table点击当前行和划过展示鼠标

在 Element Plus 的 el-table 组件中&#xff0c;设置滑过行时鼠标的样式可以通过 CSS 来实现。你可以使用 CSS 的 cursor 属性来定义鼠标悬停时的样式。以下是一个简单的例子&#xff1a; 首先&#xff0c;在你的 Vue 组件的 .el-table .el-table__row:hover {cursor: poin…

09.AOP-尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)

现有代码缺陷 针对带日志功能的实现类&#xff0c;我们发现有如下缺陷&#xff1a; 对核心业务功能有干扰&#xff0c;导致程序员在开发核心业务功能时分散了精力附加功能分散在各个业务功能方法中&#xff0c;不利于统一维护 解决思路 解决核心&#xff1a;解耦。把附加功能从…

glm-4 联网搜索 api 测试

今天测试了一下 glm-4 的联网搜索 web_search tool 调用&#xff0c;发现了 web_search 的网页检索返回结果中几个比较诡异的事情&#xff0c;特此记录&#xff1a; 有些检索结果没有 icon、link、media 字段&#xff0c;但从内容上看确实是联网搜索出来的结果&#xff0c;不知…

从零开始读RocketMq源码(三)Broker存储Message流程解析

目录 前言 准备 消息载体CommitLog 文件持久化位置 源码解析 broker消息对象MessageExtBrokerInner 异步存储message CommitLog的真相 创建MappedFile文件 加入异步刷盘队列 Message异步存储MappedByteBuffer 总结 前言 在面试中我们经常会听到这样的回答&#x…

国产化趋势下源代码数据防泄密的信创沙盒的方案分享

随着国产化的大力推进&#xff0c;越来越多的企事业单位在逐步替换Windows、Linux等操作系统的使用。那么什是国产化了&#xff1f;国产化是指在产品或服务中采用国内自主研发的技术和标注&#xff0c;替代过去依赖的他国的产品和服务&#xff0c;国产化又被称之为“信创”&…

GitLab CI/CD实现项目自动化部署

1 GitLab CI/CD介绍 GitLab CI/CD 是 GitLab 中集成的一套用于软件开发的持续集成&#xff08;Continuous Integration&#xff09;、持续交付&#xff08;Continuous Delivery&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;工具。这套系统允许开发团队…

vue里实现点击按钮回到页面顶部功能,博客必备!

效果 步骤 1-标签结构 动态绑定样式style&#xff0c;监听点击事件&#xff0c;后续控制opacity透明度。和滚动距离 <div class"toTop" :style"dynamicStyles" click"toTop"><!--<i class"fa fa-arrow-up"></i>…

Django ORM中的F 对象

F 对象非常强大&#xff0c;可以在查询和更新操作中进行复杂的字段间运算。 假设我们有一个包含商品信息的模型 Product&#xff1a; from django.db import modelsclass Product(models.Model):name models.CharField(max_length100)price models.DecimalField(max_digits…

MySQL向自增列插入0失败问题

问题 在一次上线时&#xff0c;发现通过脚本添加的状态表中&#xff0c;待提交的状态不正确&#xff0c;本来应该是0&#xff0c;线上是101。 原因 默认情况下&#xff0c;MySQL对应自增列&#xff0c;认为0和null等价&#xff08;因为mysql认为0不是最佳实践不推荐使用&…

超简单的通配证书签发工具,免费,无需安装任何插件到本地

常见的acme.sh 或者 lego等工具需要配置&#xff0c;安装不灵活&#xff0c;续签需要配置计划任务&#xff0c;签发单域名证书或者通配证书需要不同的指令和配置&#xff0c;繁琐&#xff0c;如果自己程序想要对接签发证书的api有的不支持&#xff0c;有的用起来繁琐。 最近发…

[手机Linux PostmarketOS]三, Alpine Linux命令使用

Alpine Linux 一些常用的指令&#xff1a; 添加国内源下载链接&#xff1a; 编译以下文件&#xff0c;添加链接进去&#xff1a; sudo vi /etc/apk/repositories##清华源&#xff1a; https://mirror.tuna.tsinghua.edu.cn/alpine/latest-stable/main https://mirror.tuna.tsi…

【VIVADO SDK调试遇到DataAbortHandler】

问题 SDK调试遇到DataAbortHandler问题。 运行后不显示结果&#xff0c;debug模式下发现进入DataAbortHandler异常函数。程序中存在大数组。 原因:SDK默认的堆栈为1024bytes,需要将堆栈调大。 修改方法&#xff1a; 解决:对application中src下的lscript.ld双击&#xff0c;…

android 添加一个水平线

在Android中&#xff0c;添加一个水平线通常可以通过几种方式实现&#xff0c;最常见的是使用View组件或者自定义的Drawable。下面是一个简单的例子&#xff0c;展示如何在布局文件中添加一个水平线&#xff1a; 使用View组件 在你的布局XML文件中&#xff0c;你可以添加一个…

Linux 程序卡死的特殊处理

一、前言 Linux环境。 我们在日常编写的程序中&#xff0c;可能会出现一些细节问题&#xff0c;导致程序卡死&#xff0c;即程序没法正常运行&#xff0c;界面卡住&#xff0c;也不会闪退... 当这种问题出现在客户现场&#xff0c;那就是大问题了。。。 当我们暂时还无法排…