Mybatis-plus 分页的三种写法
前提:整合mybaitsPlus
<mybatis-plus-generator.version>3.2.0</mybatis-plus-generator.version>
<freemarker.version>2.3.28</freemarker.version>
<fastjson.version>1.2.47</fastjson.version>
<velocity.version>2.3</velocity.version>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>${mybatis-plus-boot-starter.version}</version>
<scope>compile</scope>
</dependency>
项目结构
增加插件
package com.land.cloud.owner.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author IT-lc
* @date 2024/11/29
* @description 分页插件
*/
@Configuration
@MapperScan("com.land.cloud.owner.mapper")
public class MybatisPlusConfig {
/**
* 配置mybatis plus 拦截器
* @return
*/
@Bean
public MybatisPlusInterceptor InnerInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//添加分页插件
PaginationInnerInterceptor innerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
innerInterceptor.setMaxLimit(50L);
interceptor.addInnerInterceptor(innerInterceptor);
return interceptor;
}
}
MybatisPlus 的 baseMapper.selectPage 示例
public void page1(int currentPage, int pageSize) {
Page<Fruit> page = new Page<>(currentPage, pageSize);
page.addOrder(OrderItem.asc("id")); // 排序
// 优化 COUNT 查询的 SQL 语句,提升性能,默认优化(true) , 当查询包含复杂的 JOIN 或 DISTINCT 时,优化可能不准确,可以设置为 false
// page.setOptimizeCountSql(false); // 关闭 COUNT SQL 优化:
// page.setSearchCount(false); // 查询总记录数
// page.setCountId("customCountId"); // 设置自定义 COUNT 查询
// page.setMaxLimit(100L); // 设置单页最多查询 100 条记录
this.fruitMapper.selectPage(page, new LambdaQueryWrapper<Fruit>().like(Fruit::getName, "aa"));
long total = page.getTotal(); // 总记录数
long pages = page.getPages(); // 总页数
long rPageSize = page.getSize(); // 获取每页显示的记录数=pageSize
long current = page.getCurrent(); // 当前页码
List<OrderItem> orders = page.orders();// 获取排序规则
List<Fruit> records = page.getRecords();
boolean hasNext = page.hasNext(); // 是否有下一页
boolean hasPrevious = page.hasPrevious();// 是否有上一页
System.out.println("当前页数据:" + records);
System.out.println("总记录数:" + total);
System.out.println("是否有下一页:" + hasNext);
}
基于MyBatisPlus.IService.ServiceImpl 的快捷查询方法分页示例
public void page2(int currentPage, int pageSize) {
Page<Fruit> page = new Page<>(currentPage, pageSize);
page.addOrder(OrderItem.asc("id")); // 排序
this.lambdaQuery()
.eq(Fruit::getName, "aaaa")
.orderBy(true, false, Fruit::getId)
.page(page);
long total = page.getTotal(); // 总记录数
long pages = page.getPages(); // 总页数
long rPageSize = page.getSize(); // 获取每页显示的记录数=pageSize
long current = page.getCurrent(); // 当前页码
List<OrderItem> orders = page.orders();// 获取排序规则
List<Fruit> records = page.getRecords();
boolean hasNext = page.hasNext(); // 是否有下一页
boolean hasPrevious = page.hasPrevious();// 是否有上一页
System.out.println("当前页数据:" + records);
System.out.println("总记录数:" + total);
System.out.println("是否有下一页:" + hasNext);
}
PageHelper 分页插件的使用
更多使用方式参考:官方文档
依赖
<properties>
<pagehelper.version>1.4.6</pagehelper.version>
</properties>
<dependencyManagement>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.version}</version>
</dependency>
</dependencyManagement>
使用
public void page3(int currentPage, int pageSize, Fruit fruit) {
// 设置分页参数,第一页,分页条数为10
PageHelper.startPage(currentPage, pageSize);
// 开始查询 List instanceOf Page
List<Fruit> list = fruitMapper.selectAll(fruit);
// // 将查询结果包装到PageInfo,PageInfo中包含了页码,查询结果,当前页码等信息
PageInfo<Fruit> pageInfo = new PageInfo<>(list);
int pages = pageInfo.getPages();
long total = pageInfo.getTotal();
int pageNum = pageInfo.getPageNum();
List<Fruit> fruits = pageInfo.getList();
}
问题注意:
-
1.2.6 版本的com.github.pagehelper存在依赖循环,升级到最高版本即可解决
-
PageHelper 插件的方式使用注意要每次都清除一下(参考:https://blog.youkuaiyun.com/qq_31086797/article/details/106628523)
PageHelper的参数清除方法
public abstract class PageMethod {
protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal();
protected static boolean DEFAULT_COUNT = true;
public PageMethod() {
}
public static void clearPage() {
LOCAL_PAGE.remove();
}
}