上一篇文章中封装了通用的返回结果、通用分页结果。本文具体记录一下如何基于Mybatis实现分页查询。
参考文章:
Github:pagehelper-spring-boot
Github:HowToUse.md
mybatis-plus分页查询三种方法
MyBatis-Plus分页插件
系列文章指路👉
系列文章-基于SpringBoot3创建项目并配置常用的工具和一些常用的类
文章目录
- 1. PageHelper
- 1.1 引入依赖
- 1.2 yml配置
- defaultCount
- reasonable
- pageSizeZero
- 1.3 使用示例
- 示例
- 排序
- 2. MybatisPlus 分页插件
- 2.1插件配置
- 2.2使用示例
- 使用BaseMapper中的 selectPage
- 使用IService中的 selectPage
- 手写的sql实现分页
- 排序
1. PageHelper
如果你也在用 MyBatis,建议尝试该分页插件,这一定是最方便使用的分页插件。这是作者对这款插件的评价,也是我对这款插件的评价。通过示例可以看到,几乎零配置,寥寥几行就实现了分页。
1.1 引入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.7</version>
</dependency>
1.2 yml配置
下述属性都有默认值,所以本步骤可以略过。
测试代码来源于 1.3使用示例
pagehelper:
reasonable: false
pageSizeZero: false
defaultCount: true
defaultCount
用于控制默认不带 count 查询的方法中,是否执行 count 查询,默认 true
①true
:
在执行查询sql前,先执行了count(0)操作查出了一共有多少条记录。
PageInfo<Fruit> page = new PageInfo<>(fruits);
获取到的Pageinfo中包含准确的total
为14.
②false
:
可以发现未执行count(0)sql
PageInfo<Fruit> page = new PageInfo<>(fruits);
获取到的Pageinfo,total
为-1.
reasonable
分页合理化参数,默认值为false
。当该参数设置为 true
时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。
{offset:-10,limit:10}
: 实际查询的第一页
{offset:1000,limit:10}
: 实际查询的最后一页
pageSizeZero
默认值为 false
,当该参数设置为 true
时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果。
{offset:0,limit:0}
: 查询出了所有结果
1.3 使用示例
示例
也可以计算出pageNum,使用
PageHelper.startPage()
@GetMapping("/pageQuery")
@Operation(summary = "pageQuery", description = "分页查询")
public Object pageQuery(@RequestParam(defaultValue = "0", value = "offset") int offset,
@RequestParam(defaultValue = "10", value = "limit") int limit) {
PageHelper.offsetPage(offset,limit);
List<Fruit> fruits = fruitService.list();
PageInfo<Fruit> page = new PageInfo<>(fruits);
PageResult<List<Fruit>> pageRes = new PageResult<>(page.getTotal(), fruits);
return BaseResult.success(pageRes);
}
排序
offsetPage()后紧跟一个orderBy即可
PageHelper.offsetPage(offset, limit);
if(StrUtil.isNotEmpty(sort)){
PageHelper.orderBy(sort + " " + order);
}
List<Fruit> fruits = fruitService.list();
{offset:9,limit:4,sort:fr_name,order:ASC}
这里需要注意:
sort
是数据库中对应的字段,而不是实体类中的矮驼峰形式。
2. MybatisPlus 分页插件
MybatisPlus 之前已经引入,详情见顶部的系列文章
2.1插件配置
新建配置类,引入分页插件。
@Configuration
public class YaMybatisPlusConfig {
/**
* 最新版
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
2.2使用示例
先使用行偏移量
offset
计算出pageNum
使用BaseMapper中的 selectPage
@GetMapping("/pageQuery3")
@Operation(summary = "pageQuery3", description = "分页查询-使用MybatisPlus分页插件 baseMapper")
public Object pageQuery3(@RequestParam(defaultValue = "0", value = "offset") int offset,
@RequestParam(defaultValue = "10", value = "limit") int limit) {
int pageNum = offset / limit + 1;
Page<Fruit> page = new Page<>(pageNum, limit);
fruitMapper.selectPage(page, new QueryWrapper<>());
PageResult<List<Fruit>> pageRes = new PageResult<>(page.getTotal(), page.getRecords());
return BaseResult.success(pageRes);
}
{offset:9,limit:4}
查询第3页,页大小为4。
使用IService中的 selectPage
@GetMapping("/pageQuery4")
@Operation(summary = "pageQuery4", description = "分页查询-使用MybatisPlus分页插件 IService")
public Object pageQuery4(@RequestParam(defaultValue = "0", value = "offset") int offset,
@RequestParam(defaultValue = "10", value = "limit") int limit) {
int pageNum = offset / limit + 1;
Page<Fruit> page = new Page<>(pageNum, limit);
// fruitService.page(page);
fruitService.page(page, new QueryWrapper<>());
PageResult<List<Fruit>> pageRes = new PageResult<>(page.getTotal(), page.getRecords());
return BaseResult.success(pageRes);
}
{offset:9,limit:4}
查询第3页,页大小为4。
手写的sql实现分页
FruitMapper.java
/**
* 分页查询水果
* @param pageInfo 分页参数
* @param paramsMap 查询参数
* @return IPage水果分页
*/
IPage<Fruit> pageQueryFruit(Page<Fruit> pageInfo, Map<String, Object> paramsMap);
FruitMapper.xml
<select id="pageQueryFruit" parameterType="map" resultType="com.ya.boottest.fruit.entity.Fruit">
SELECT id, fr_code, fr_name, fr_price
FROM fruit
WHERE 1 = 1
</select>
FruitController.java
@GetMapping("/pageQuery5")
@Operation(summary = "pageQuery5", description = "分页查询-使用MybatisPlus分页插件 手写sql")
public Object pageQuery5(@RequestParam(defaultValue = "0", value = "offset") int offset,
@RequestParam(defaultValue = "10", value = "limit") int limit) {
int pageNum = offset / limit + 1;
Page<Fruit> page = new Page<>(pageNum, limit);
Map<String, Object> paramsMap = new HashMap<>();
// 放入自己的查询条件
fruitMapper.pageQueryFruit(page, paramsMap);
PageResult<List<Fruit>> pageRes = new PageResult<>(page.getTotal(), page.getRecords());
return BaseResult.success(pageRes);
}
{offset:9,limit:4}
查询第3页,页大小为4。
排序
可以使用QueryWrapper.orderBy(), 也可以放到paramsMap中自己拼接。
本文介绍放到Page的OrderItem列表中这种方式
{offset:9,limit:4,sort:fr_name,order:DESC}
同样需要注意:
sort
是数据库中对应的字段,而不是实体类中的矮驼峰形式。
page.addOrder(new OrderItem(sort,"ASC".equals(order)));
/* List<OrderItem> orderItems = new ArrayList<>();
orderItems.add(new OrderItem(sort,"ASC".equals(order)));
page.addOrder(orderItems);*/
执行sql:
ps. 我个人更喜欢用PageHelper,可能是公司项目用,加上先入为主吧。
零落成泥碾作尘,只有香如故。
—— 陆游·南宋《卜算子·咏梅》