Spring中使用MyBatis PageHelper

简介

PageHelper是在使用MyBatis的时候来辅助简单实现分页功能的工具,其原理是利用MyBatis的拦截器,在查询数据库的时候,拦截下sql,然后进行修改。

  • 支持多种数据库
  • 支持多种分页方式

官方地址为:https://pagehelper.github.io/
GitHub地址为:https://github.com/pagehelper/Mybatis-PageHelper
在Spring Boot中快速继承的GitHub地址为:https://github.com/pagehelper/pagehelper-spring-boot

使用

添加依赖

添加如下依赖到pom文件中即可。

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

支持的集中调用方式

//第一种,RowBounds方式的调用
List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));

//第二种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectIf(1);

//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(1, 10);
List<Country> list = countryMapper.selectIf(1);

//第四种,参数方法调用
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
    List<Country> selectByPageNumSize(
            @Param("user") User user,
            @Param("pageNum") int pageNum,
            @Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代码中直接调用:
List<Country> list = countryMapper.selectByPageNumSize(user, 1, 10);

//第五种,参数对象
//如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
//有如下 User 对象
public class User {
    //其他fields
    //下面两个参数名和 params 配置的名字一致
    private Integer pageNum;
    private Integer pageSize;
}
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
    List<Country> selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
List<Country> list = countryMapper.selectByPageNumSize(user);

//第六种,ISelect 接口方式
//jdk6,7用法,创建接口
Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
    @Override
    public void doSelect() {
        countryMapper.selectGroupBy();
    }
});
//jdk8 lambda用法
Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(()-> countryMapper.selectGroupBy());

//也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
    @Override
    public void doSelect() {
        countryMapper.selectGroupBy();
    }
});
//对应的lambda用法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> countryMapper.selectGroupBy());

//count查询,返回一个查询语句的count数
long total = PageHelper.count(new ISelect() {
    @Override
    public void doSelect() {
        countryMapper.selectLike(country);
    }
});
//lambda
total = PageHelper.count(()->countryMapper.selectLike(country));

更多详细的介绍,可以在pagehelper官方介绍文档中查看。我个人第二种使用的方式比较多一些。

代码中使用

package com.lucky.spring;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lucky.spring.dao.CoffeeMapperExt;
import com.lucky.spring.model.Coffee;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.List;

@SpringBootApplication
@MapperScan("com.lucky.spring.dao")
@Slf4j
public class Application implements CommandLineRunner {

    @Autowired
    CoffeeMapperExt coffeeMapperExt;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        PageHelper.startPage(1, 0);
        List<Coffee> coffees = coffeeMapperExt.queryCoffeeList();
        PageInfo<Coffee> info = new PageInfo<>(coffees);
        log.info("coffees:{}", coffees);
        log.info("pageNum:{}",info.getPageNum());
        log.info("pageSize:{}",info.getPageSize());
        log.info("total:{}",info.getTotal());
        log.info("hasPreviousPage:{}",info.isHasPreviousPage());
        log.info("hasNextPage:{}",info.isHasNextPage());
    }
}

配置说明

在使用PageHelper分页查询的时候,PageHelper也提供了一些配置参数,帮助我们一些场景的使用。

# 分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
pagehelper.reasonable=true
#当pageSize为0时查询全部
pagehelper.page-size-zero=true
posted @ 2020-08-02 14:56  在线打工者  阅读(411)  评论(2编辑  收藏  举报