携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
大家好! 我是慕歌,一只想教你学习 Spring Boot的野生coder! 欢迎来到慕歌的 Sping boot系列教程,希望通过这个教程带大家搭建基础的 Spring Boot项目,该教程所有知识点均来源于本人的真实开发!
前言
在搭建了基础的CRUD工程后,需要根据需求开发接口,而分页是操作过程中不可缺少的组件。前一节中已经分享了如何使用Mybatis-plus ,以及MybatisX 插件,这一节中我们将学习mybatis-plus 的分页插件,以及知名分页逐渐pageHelper。
文档链接:www.mybatis-plus.com/guide/inter…
pageHelper:pagehelper.github.io/
引入:
使用pageHelper 需要在pom.xml 中添加对应的包,pagehelper 需要指定版本,不受spring boot 父工程的版本控制
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
配置:
指定pagehelper 的专属配置:
#pagehelper分页插件配置
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
pagehelper分页使用:
使用pagehelper 的方法比较简单,官方文档介绍了六种开发方式,每种方式既具有自己的优势,但推荐使用第二,三种静态配置的方式。
//第一种,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);
在我的开发过程中,使用第二种方式较多,在mapper层使用自定义查询语句查询数据,并在开始时指定页长和当前页,后一句接我们的语句,就可得到分页后的数据对象。
//获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
//紧跟着的第一个select方法会被分页
List<Country> list = countryMapper.selectIf(1);
assertEquals(2, list.get(0).getId());
assertEquals(10, list.size());
//分页时,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>
assertEquals(182, ((Page) list).getTotal());
这里的查询语句可自定义,返回的的pageInfo 对象参数是非常全面的,如果不需要这么多的参数,大家还可以进行二次封装,使我们的返回结果看起来更简洁,下一节中,我将附上我常使用的分页工具类。
Ipage 分页
ipage 分页是mybatis-plus 提供的分页插件,使用与pagehelper 有一些不一样,自定义的阶段被放在了mapper层,在service 层可直接调用方法,就可返回带有完整分页信息的page对象
//以Ipage为返回值,第一个参数使用官方的page对象
IPage<UserVo> selectPageVo(IPage<?> page, Integer state);
// or (class MyPage extends Ipage<UserVo>{ private Integer state; })
MyPage selectPageVo(MyPage page);
CRUD 中的page方法可以直接使用,直接传入分页参数,即可得到分页后的page对象,但建议使用分页工具类再封装一次。mybatis-plus 自定义分页的关键是第一个参数传入page 对象类,与pagehelper 类的作用有些类似。
结语
这一章的分享到这里就结束了,下一节中还将带来redis 的分享!
如果您觉得本文不错,欢迎点赞支持,您的关注是我坚持的动力!