在日常开发需要对数据进行分页,配置如下
-
- <dependency>
- <groupId>com.baomidougroupId>
- <artifactId>mybatis-plus-boot-starterartifactId>
- <version>3.4.0version>
- dependency>
编写配置类
- @Configuration
- public class MybatisPlusConfiguration {
-
- /**
- * 配置mysql拦截器
- * @return
- */
- @Bean
- public MybatisPlusInterceptor mybatisPlusInterceptor() {
- MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
- interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
- return interceptor;
- }
-
- }
在控制器层可以加上之后使用
page.setOptimizeCountSql(false);
了解如下
- page.setOptimizeCountSql(false); 是 MyBatis 框架中的一个配置选项,用于控制是否优化分页查询中的总记录数查询 SQL。这通常用于分页查询,其中需要获取总记录数以计算总页数等信息
-
- 当 page.setOptimizeCountSql(true); 时,MyBatis 将尝试优化总记录数查询 SQL,以提高性能。通常,这意味着 MyBatis 会尝试从分页查询的 SQL 语句中提取总记录数,而不会执行额外的总记录数查询
-
- 当 page.setOptimizeCountSql(false); 时,MyBatis 将不进行总记录数查询的优化,而是会执行一个额外的 SQL 查询来获取总记录数。这可以保证总记录数的准确性,但可能会增加数据库的负载,尤其在处理大数据集时
-
- 选择是否启用总记录数查询的优化取决于你的具体需求和性能要求。如果你可以容忍轻微的性能损失以获得更准确的总记录数,可以将其设置为 false,否则,你可以将其设置为 true 以提高性能
大致流程如下
在控制器中注入业务层实现方法时需要加上参数IPage
- public R pageByListAll(Page page) //传入 current=页码,size=页大小
- {
- IPage
pageData = dabaimaoService.listAll(page); //(dabaimao为查询结果集的类) - return R.ok(pageData);
- }
在Service中实现将Ipage传入Mapper文件中
- /**
- * 分页
- * @param current 页码
- * @param size 页大小
- * @return
- */
- @Override
- public IPage
listAll(IPage page) { - // IPage
pageset = new IPage(page, size); - //也可以直接使用IPage获取
- IPage
pageData = this.baseMapper.listAll(page); - //数据进行分页变成IPage对象
- return pageData;
- }
在mapper层中加入参数Ipage实现分页
IPage listAll(IPage page);
结果如下

上面是使用mybatis-puls实现分页,也可以使用Pagehandle这个工具类
- <dependency>
- <groupId>com.github.pagehelpergroupId>
- <artifactId>pagehelper-spring-boot-starterartifactId>
- <version>1.4.2version>
- dependency>
获得数据后
- PageHelper.startPage(page, size);
- PageInfo
pageData= new PageInfo<>(data);
工具类如下
- @Component
- public class PageInfoUtil {
- public static PageInfo
getData(List data, int pageNumber, int pageSize) { - PageHelper.startPage(pageNumber, pageSize);
- PageInfo
Result= new PageInfo<>(data); - return Result;
- }
- }
结果如下

最后可以自己写一个工具类
- public class PaginationInfo
{ - private int pageNum; // 当前页码
- private int pageSize; // 每页大小
- private int size; // 当前页数据条数
- private int startRow; // 当前页的起始行
- private int endRow; // 当前页的结束行
- private long total; // 总数据条数
- private int pages; // 总页数
- private List
list; // 当前页的数据列表 - private int prePage; // 前一页页码
- private int nextPage; // 后一页页码
- private boolean isFirstPage; // 是否是第一页
- private boolean isLastPage; // 是否是最后一页
- private boolean hasPreviousPage; // 是否有前一页
- private boolean hasNextPage; // 是否有后一页
- private int navigatePages; // 导航页码数
- private int navigateFirstPage; // 导航页的第一页页码
- private int navigateLastPage; // 导航页的最后一页页码
- private List
navigatepageNums; // 导航页码列表 -
- // 构造函数,用于创建 PaginationInfo 对象
- public PaginationInfo(List
data, int pageNum, int pageSize) { - this.pageNum = pageNum;
- this.pageSize = pageSize;
- this.list = data;
- this.total = data.size();
- this.pages = (int) Math.ceil((double) total / pageSize);
-
- if (pageNum < 1) {
- pageNum = 1;
- } else if (pageNum > pages) {
- pageNum = pages;
- }
-
- int fromIndex = (pageNum - 1) * pageSize;
- int toIndex = Math.min(fromIndex + pageSize, data.size());
-
- this.size = toIndex - fromIndex;
- this.list = data.subList(fromIndex, toIndex);
- this.startRow = fromIndex + 1;
- this.endRow = fromIndex + size;
- this.prePage = pageNum > 1 ? pageNum - 1 : 1;
- this.nextPage = pageNum < pages ? pageNum + 1 : pages;
- this.isFirstPage = pageNum == 1;
- this.isLastPage = pageNum == pages;
- this.hasPreviousPage = pageNum > 1;
- this.hasNextPage = pageNum < pages;
- this.navigatePages = 8; // 可以根据需要进行调整
- this.calcNavigatePageNumbers();
-
- if (this.navigatepageNums != null && !this.navigatepageNums.isEmpty()) {
- this.navigateFirstPage = this.navigatepageNums.get(0);
- this.navigateLastPage = this.navigatepageNums.get(this.navigatepageNums.size() - 1);
- }
- }
-
- // 计算导航页码列表
- private void calcNavigatePageNumbers() {
- navigatepageNums = new ArrayList<>();
- int startNum;
- int endNum;
-
- if (pages <= navigatePages) {
- startNum = 1;
- endNum = pages;
- } else {
- int halfPages = navigatePages / 2;
- startNum = pageNum - halfPages;
- endNum = pageNum + halfPages;
-
- if (startNum < 1) {
- startNum = 1;
- endNum = navigatePages;
- }
-
- if (endNum > pages) {
- endNum = pages;
- startNum = pages - navigatePages + 1;
- }
- }
-
- for (int i = startNum; i <= endNum; i++) {
- navigatepageNums.add(i);
- }
- }
- }
测试如下
- public static void main(String[] args) {
- // 创建一个示例数据列表
- List
dataList = new ArrayList<>(); - for (int i = 1; i <= 50; i++) {
- dataList.add("Item " + i);
- }
-
- // 每页显示10条数据
- int pageSize = 10;
-
- // 测试PaginationInfo类
- PaginationInfo
paginationInfo = new PaginationInfo<>(dataList, 1, pageSize); -
- // 打印分页信息
- System.out.print("当前页:" + paginationInfo.getPageNum()+" ");
- System.out.print("每页大小:" + paginationInfo.getPageSize()+" ");
- System.out.print("总数据条数:" + paginationInfo.getTotal()+" ");
- System.out.print("总页数:" + paginationInfo.getPages()+" ");
- System.out.print("当前页数据条数:" + paginationInfo.getSize()+" ");
- System.out.print("是否第一页:" + paginationInfo.isFirstPage()+" ");
- System.out.print("是否最后一页:" + paginationInfo.isLastPage()+" ");
- System.out.print("前一页页码:" + paginationInfo.getPrePage()+" ");
- System.out.print("后一页页码:" + paginationInfo.getNextPage()+" ");
-
- // 打印当前页的数据列表
- List
currentPageData = paginationInfo.getList(); - System.out.println("当前页的数据:");
- for (String item : currentPageData) {
- System.out.println(item);
- }
-
-
- // 打印导航页码列表
- List
navigatePageNums = paginationInfo.getNavigatepageNums(); - System.out.println("导航页码列表:");
- for (Integer pageNum : navigatePageNums) {
- System.out.println(pageNum);
- }
- System.out.println(paginationInfo.toString());
- }
运行

上述方法都可以