SpringBoot中使用PageHelper分页

前言

  • PageHelper分页插件,最方便使用的分页插件。分页插件支持任何复杂的单表、多表分页
  • 官方文档:https://pagehelper.github.io/

添加依赖

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

配置文件

这里有两种方式:

  • mybatis的全局配置文件中配置

    <!--
        plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
        properties?, settings?,
        typeAliases?, typeHandlers?,
        objectFactory?,objectWrapperFactory?,
        plugins?,
        environments?, databaseIdProvider?, mappers?
    -->
    <plugins>
        <!-- com.github.pagehelper为PageHelper类所在包名 -->
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
            <property name="helperDialect" value="mysql"/>
        </plugin>
    </plugins>
    
  • application.yml文件中配置

    # pageHelper分页配置
    pagehelper:
      helper-dialect: mysql
      reasonable: true
      support-methods-arguments: true
    

    在这里插入图片描述

简单使用

举个例子,前台用户列表数据展示

通用类准备
/**
 * 返回数据实体
 */
public class AjaxResponse{

    private String code;

    private String errMsg;

    private Object data;

    public AjaxResponse(String code, String errMsg, Object data) {
        this.code = code;
        this.errMsg = errMsg;
        this.data = data;
    }

    public AjaxResponse(String code, String errMsg) {
        this.code = code;
        this.errMsg = errMsg;
    }

    public static AjaxResponse suc(Object data){
        return new AjaxResponse("200", "操作成功", data);
    }

    public static AjaxResponse err(String errMsg){
        return new AjaxResponse("400", errMsg);
    }
    //省略get set
}

/**
 * 基础分页参数类
 */
public class PageParam implements IPage {

    //页码
    private Integer pageNum = 1;

    //页数,我这里设置默认设置2,一般是10,20
    private Integer pageSize = 2;

    //排序
    private String orderBy;

    @Override
    public Integer getPageNum() {
        return pageNum;
    }

    @Override
    public Integer getPageSize() {
        return pageSize;
    }

    @Override
    public String getOrderBy() {
        return orderBy;
    }
}
流程类准备
  • 参数实体,主要用于接收前台查询条件,以及pageNumpageSize等参数

    /**
     * 用户参数
     */
    public class UserListParam extends PageParam {
    
        //用户名
        private String username;
    
        //....其他参数
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
    }
    
  • controller

    /**
     * 用户controller
     */
    @Controller
    @RequestMapping("/user")
    public class UserController {
    
        @Resource
        UserService userService;
    
        @GetMapping(value = "/getList")
        @ResponseBody
        public AjaxResponse getList(UserListParam listParam){
            //这里接收一个PageInfo,包含了返回的list,总页数,总数等前台所需数据
            PageInfo<User> pageInfo = userService.getPageList(listParam);
            return AjaxResponse.suc(pageInfo);
        }
    }
    
  • service

    public interface UserService {
    
        /**
         * 分页查询
         *
         * @param listParam 分页查询参数
         * @return pageInfo
         */
        public PageInfo<User> getPageList(UserListParam listParam);
    }
    
  • serviceImpl

    @Service
    public class UserServiceImpl implements UserService {
    
        @Resource
        private UserMapper userMapper;
    	
        //这里写了两种方式,我是比较常用第二种
        @Override
        public PageInfo<User> getPageList(UserListParam listParam) {
            /*
            PageHelper.startPage((listParam.getPageNum(), listParam.getPageSize());
            List<User> users = userMapper..getPageList(listParam);
            return new PageInfo<User>(users);
            */
            return PageHelper.startPage(listParam.getPageNum(), listParam.getPageSize())
                    .doSelectPageInfo(() -> userMapper.getPageList(listParam));
        }
    }
    
  • UserMapper

    public interface UserMapper extends BaseMapper<User> {
    
        /**
         * 列表数据获取
         * @param param 查询参数实体
         * @return list
         */
        List<User> getPageList(UserListParam param);
    }
    
  • UserMapper.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.springboot_mybatis.mapper.UserMapper">
      <resultMap id="BaseResultMap" type="com.example.springboot_mybatis.model.User">
        <id column="user_id" jdbcType="INTEGER" property="userId" />
        <result column="username" jdbcType="VARCHAR" property="username" />
      </resultMap>
      <sql id="Base_Column_List">
        user_id, username
      </sql>
    
        <select id="getPageList" resultMap="BaseResultMap">
            select * from t_user
            <where>
              <if test="username != null and username != ''">
                 instr(username, #{username}) > 0
              </if>
            </where>
        </select>
    </mapper>
    
Page类

我们刚才调用service返回的是PageInfo类,这个类主要可以帮我们计算统计我们所需的一些属性,比如总页数,是否有下一页,是否有前一页等

//测试PageInfo
@Test
public void testPage(){
    UserListParam listParam = new UserListParam();
    listParam.setUsername("陈");
    PageInfo<User> pageInfo = userService.getPageList(listParam);
    //当前页数
    System.out.println(pageInfo.getPageNum());
    //每页的数量
    System.out.println(pageInfo.getPageSize());
    //总页数
    System.out.println(pageInfo.getPages());
    //总条数
    System.out.println(pageInfo.getTotal());
    //获取到的数据
    System.out.println(pageInfo.getList());
}
简单测试

启动项目并访问http://localhost:8080/user/getList,分页成功

{
    code: "200",
    errMsg: "操作成功",
    data: {
        total: 3,
        list: [
            {
            userId: 1,
            username: "陈某某"
            },
            {
            userId: 4,
            username: "陈AA"
            }
        ],
        pageNum: 1,
        pageSize: 2,
        size: 2,
        startRow: 1,
        endRow: 2,
        pages: 2,
        prePage: 0,
        nextPage: 2,
        isFirstPage: true,
        isLastPage: false,
        hasPreviousPage: false,
        hasNextPage: true,
        navigatePages: 8,
        navigatepageNums: [
            1,
            2
        ],
        navigateFirstPage: 1,
        navigateLastPage: 2
    }
}

通过日志我们可以查看除了分页查询sql,还有一条查询总条数的sql

 SELECT count(0) FROM t_user 
 SELECT user_id,username FROM t_user LIMIT ? 

如果我们不需要查询总数:可以使用PageHelper重载方法, 但是如果设置不去查询总数,总页数pages也拿取不到

PageHelper.startPage(listParam.getPageNum(), listParam.getPageSize(), false);

/**
 * 开始分页
 *
 * @param pageNum  页码
 * @param pageSize 每页显示数量
 * @param count    是否进行count查询
 */
public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count) {
    return startPage(pageNum, pageSize, count, null, null);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值