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
知行合一