首页 > 其他分享 >4.1 MyBatis 分页插件

4.1 MyBatis 分页插件

时间:2024-11-03 13:19:21浏览次数:1  
标签:插件 4.1 int pagehelper Paging MyBatis import PageHelper com

分页查询基本上是必备的能力,MyBaits 可以通过插件来很好的支持分页查询,目前最成熟的方案是pagehelper这个第三方插件。

我们只需要在工程的 pom.xml 里添加如下的依赖即可,目前最新的版本是1.2.13

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.13</version>
</dependency>

pagehelper 非常易用,内部做了很多的优化工作,让开发者基本不需要额外处理 MyBatis XML 逻辑,我们通过代码来看一下,继续改造 UserController.getAll 方法

package com.youkeda.comment.control;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.youkeda.comment.dao.UserDAO;
import com.youkeda.comment.dataobject.UserDO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

@Controller
public class UserController {

    @Autowired
    private UserDAO userDAO;

    @GetMapping("/users")
    @ResponseBody
    public List<UserDO> getAll() {
        // 设置当前页数为1,以及每页3条记录
        Page<UserDO> page = PageHelper.startPage(1, 3).doSelectPage(() -> userDAO.findAll());
        return page.getResult();
    }

}

如上,我们使用PageHelper类来处理分页,它的完整包名是

com.github.pagehelper.PageHelper

我们结合 lambda 语法,在doSelectPage lambda 方法中执行 MyBatis 查询方法,就会自动执行分页逻辑,并且返回分页对象Page,我们在仔细看看方法调用的情况

PageHelper.startPage(1, 3);

startPage第一个参数是指定页数,第二个参数指定的是每页的记录数

MyBatis PageHelper 比较智能,如果查询第0页会自动转化为查询第一页(让开发者不纠结这个坐标值),如果查询的页数超过总页数也会自动查询最后一页。比如下面的调用和上面是一样的

PageHelper.startPage(0, 3);

返回类型Page对象是 MyBatis 封装的分页模型,通过这个我们可以得到

  • getResult() 获取分数数据
  • getPages() 获取总页数
  • getTotal() 获取总记录数
  • getPageNum() 获取当前页面数

Page 的完整路径是 com.github.pagehelper.Page

在企业开发中,我们都会额外封装一个通用的分页模型Paging用于处理返回值,参考如下

以后我们再各种项目中可能会经常复用这个模型,就不再额外介绍啦

package com.youkeda.comment.model;

import java.io.Serializable;
import java.util.List;

/**
 * 分页模型
 */
public class Paging<R> implements Serializable {

    private static final long serialVersionUID = 522660448543880825L;
    /**
     * 页数
     */
    private int pageNum;

    /**
     * 每页数量
     */
    private int pageSize = 15;
    /**
     * 总页数
     */
    private int totalPage;

    /**
     * 总记录数
     */
    private long totalCount;

    /**
     * 集合数据
     */
    private List<R> data;

    public Paging() {

    }

    public Paging(int pageNum, int pageSize, int totalPage, long totalCount, List<R> data) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.totalPage = totalPage;
        this.totalCount = totalCount;
        this.data = data;
    }

    // 省略 getter、setter

}

Paging 模型比较简单,主要提供

  • pageNum 当前页面数

  • pageSize 每页记录数

  • totalPage 总页面数

  • totalCount 总记录数

  • data 当前页面的集合数据 我们还提供了一个构造函数

    public Paging(int pageNum, int pageSize, int totalPage, long totalCount, List<R> data)
    

我们继续改造一下 UserController.getAll 方法

package com.youkeda.comment.control;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.youkeda.comment.dao.UserDAO;
import com.youkeda.comment.dataobject.UserDO;
import com.youkeda.comment.model.Paging;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

@Controller
public class UserController {

    @Autowired
    private UserDAO userDAO;

    @GetMapping("/users")
    @ResponseBody
    public Paging<UserDO> getAll() {
        // 设置当前页数为1,以及每页3条记录
        Page<UserDO> page = PageHelper.startPage(1, 3).doSelectPage(() -> userDAO.findAll());

        return new Paging<>(page.getPageNum(), page.getPageSize(), page.getPages(), page.getTotal(), page
                .getResult());
    }
}

标签:插件,4.1,int,pagehelper,Paging,MyBatis,import,PageHelper,com
From: https://www.cnblogs.com/T-double/p/18523194

相关文章

  • 2024.11.2 模拟赛
    2024.11.2模拟赛T1P11242碧树把\(n\)个点往外连即可。最终答案为\(n-\max_{i=1}^na_i+1\)T2P11243繁花感觉我的做法麻烦了,而且随机复杂度()显然的,从左往右看可以分层,遇到一次大于号分一次。对于每段,遍历一遍,每遇到一次小于号计算一次答案。如果不考虑等于号,这段的......
  • 3.2 MyBatis XML 循环语句
    MyBasis批量插入(foreach)比如批量插入user,我们先创建DAO方法WhatisDAO?DAO(DataAccessObject)模型就是写一个类,把访问数据库的代码封装起来,DAO在数据库与业务逻辑(Service)之间。Dao是数据访问层,Dao的作用是封装对数据库的访问:增删改查,不涉及业务逻辑,只是达到按某个条件获得......
  • spring、mybatis、并发、虚拟机总结
    1、spring扩展接口在Spring框架中,扩展接口是一种强大的机制,允许开发者在Spring容器的生命周期中插入自定义逻辑。以下是一些常用的Spring扩展接口及其使用方式:BeanDefinitionRegistryPostProcessor:这个接口在读取项目中的beanDefinition之后执行,提供一个补充的扩展点。你可......
  • Mybatis参数传递&注解开发
    参数传递点击查看代码/*MyBatis参数封装:*单个参数:1.POJO类型:直接使用,属性名和参数占位符名称一致2.Map集合:直接使用,键名和参数占位符名称一致3.Collection:封装为Map集合,可以使用@Param注解,替换Map集......
  • Mybatis修改
    1.删除一个点击查看代码voiddeleteById(intid);<deleteid="deleteById">deletefromtb_brandwhereid=#{id};</delete>@TestpublicvoidtestDeleteById()throwsIOException{//接收参数intid=6;......
  • Mybatis添加&修改
    一添加点击查看代码voidadd(Brandbrand);<insertid="add"useGeneratedKeys="true"keyProperty="id"><!--主键返回-->insertintotb_brand(brand_name,company_name,ordered,description,status)values(#{br......
  • 24.11.2
    (填空题)软件复用的优点有()、()、()、()。(1)提高生产率(2)减少维护代价(3)提高互操作性(4)支持快速原型2. (填空题)依据复用的对象,软件复用分为()和()。(1)产品复用(2)过程复用3. (填空题)最常用的可复用设计是()和()。(1)架构模式(2)设计模式4. (填空题)框架方法包括:()......
  • PyCharm 2024.1 解锁版 (Python集成开发IDE)详细安装步骤
    分享文件:PyCharm2024.1解锁版(Python集成开发IDE)链接:https://pan.xunlei.com/s/VOAa_CiVVvZnyQgLfpmCIOABA1提取码:cx4h安装步骤1、下载解压后点击如下进行安装2、选择安装路径3、默认勾选将PyCharm创建桌面快捷方式4、默认,点击【安装】5、安装中,耐心等待2-5分......
  • 【semantic Kernel】Semantic Kernel Tools(VS Code插件)
    2023年4月13日,Microsoft发布了一个SemanticKernel的VSCode插件,SemanticKernelTools,用于进行SemanticFunction的开发和调试工作。SemanticKernelTools的安装只需要VSCode即可,不需要额外的其他的环境。在VSCode的扩展中搜索SemanticKernelTools,点击Install即......
  • 2024.11.02模拟赛
    挂了至少30分!!不——开——心——钢哥说,大家要休息好,于是模拟赛晚点,变成了3小时3道题。T1打的正解(但没调出来版),T2T3打的暴力(但全挂了版),预计总分120+,但实际总分80。小小总结一下:昨晚多睡了一小时,今天思路确实感觉更清晰了(但也有可能是因为题目不难……)。但今天时间没分配......