SpringBoot结合mybatis-plus实现分页的项目实践
一、分页的原理
要实现分页功能方法有很多,但最基本的实现原理都差不多,所以在实现功能之前要先把原理搞明白。正如删除有 “逻辑删除” 和 “物理删除" 之分,分页也有 “逻辑分页” 和 “物理分页”;
1、逻辑分页:逻辑分页依赖于代码。(Mybatis自带的分页插件就是逻辑分页)
逻辑分页是先查询出所有的数据(只需要访问一次数据库),再根据代码块的所需 (你需要拿到第几页,每页几条的数据) 筛选出合适的数据进行分页。
2、物理分页:物理分页依赖于数据库。(更侧重于sql语句)
MySQL数据库提供的分页关键字"LIMIT ",程序员只需要编写带有关键字的SQL语句,数据库返回的数据就是分页结果。(每次都要访问数据库,对数据库造成的负担大)
但我们一般不推荐使用逻辑分页,而使用物理分页较多,因为 “逻辑分页一次性将所有的数据读取至内存中,占用了较大的内存空间;物理分页每次只读取所需的数据,占用内存比较小” 。而在使用物理分页的时候,就要考虑到limit的用法。
详解Mybatis-Plus中分页插件PaginationInterceptor
二、利用 mybatis-plus 自带分页插件Interceptor实现分页功能
MyBatis-Plus 自带的分页插件 PaginationInterceptor 就是基于物理分页实现的。该插件会拦截 SQL 执行过程中的分页参数(如 Page 对象),并根据传入的分页参数自动生成对应的 LIMIT 或者 ROWS 等分页语句,从而达到物理分页的效果。同时,PaginationInterceptor 还支持多租户和动态表名等功能。需要注意的是,如果查询条件中包含了 GROUP BY 子句,物理分页可能会出现问题,因为 LIMIT 或者 ROWS 可能会影响 GROUP BY 的结果。如果需要进行分组查询,建议使用逻辑分页或者在应用层手动处理分页结果。
下面演示按照 “性别” 进行分页,以下是具体步骤:
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 '测试用户表';
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 文件
8、设置 service 层文件(不用再写service实现层了,一个搞定,当然你分开写也可以)
9、设置 controller 层文件
10、运行结果
三、需要注意的地方:
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分页内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring Cache 集成 Caffeine实现项目缓存的示例
本文主要介绍了Spring Cache 集成 Caffeine实现项目缓存的示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2021-12-12Spring中使用LocalDateTime、LocalDate等参数作为入参
这篇文章主要介绍了Spring中使用LocalDateTime、LocalDate等参数作为入参,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-12-12
最新评论