MyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,简化开发、提高效率。其中分页功能是日常开发中非常常用的功能,本文将详细介绍 MyBatis-Plus 的分页功能使用。
首先需要在 Spring Boot 项目中配置分页插件:
@Configuration
public class MybatisPlusConfig {
/**
* 分页插件配置
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
@GetMapping("/page")
public R<IPage<User>> page(@RequestParam(defaultValue = "1") int current,
@RequestParam(defaultValue = "10") int size) {
// 创建分页对象
Page<User> page = new Page<>(current, size);
// 执行分页查询
IPage<User> userPage = userService.page(page);
return R.ok(userPage);
}
@GetMapping("/pageByCondition")
public R<IPage<User>> pageByCondition(@RequestParam(defaultValue = "1") int current,
@RequestParam(defaultValue = "10") int size,
String name) {
Page<User> page = new Page<>(current, size);
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.like(StringUtils.isNotBlank(name), User::getName, name);
IPage<User> userPage = userService.page(page, wrapper);
return R.ok(userPage);
}
public interface UserMapper extends BaseMapper<User> {
/**
* 自定义分页查询
* @param page 分页对象
* @param state 状态
* @return 分页结果
*/
IPage<User> selectPageByCustom(@Param("page") Page<User> page, @Param("state") Integer state);
}
<select id="selectPageByCustom" resultType="com.example.entity.User">
SELECT * FROM user
WHERE state = #{state}
select>
@GetMapping("/customPage")
public R<IPage<User>> customPage(@RequestParam(defaultValue = "1") int current,
@RequestParam(defaultValue = "10") int size,
Integer state) {
Page<User> page = new Page<>(current, size);
IPage<User> userPage = userMapper.selectPageByCustom(page, state);
return R.ok(userPage);
}
MyBatis-Plus 的分页结果 IPage 对象包含以下常用属性:
records
: 当前页的数据列表total
: 总记录数size
: 每页显示条数current
: 当前页pages
: 总页数可以对这些数据进行处理后再返回给前端:
@GetMapping("/pageWithProcess")
public R<Map<String, Object>> pageWithProcess(@RequestParam(defaultValue = "1") int current,
@RequestParam(defaultValue = "10") int size) {
Page<User> page = new Page<>(current, size);
IPage<User> userPage = userService.page(page);
Map<String, Object> result = new HashMap<>();
result.put("list", userPage.getRecords());
result.put("total", userPage.getTotal());
result.put("pageSize", userPage.getSize());
result.put("currentPage", userPage.getCurrent());
result.put("totalPages", userPage.getPages());
return R.ok(result);
}
对于大数据量的分页,如果不需要知道总记录数,可以设置不查询 count:
@GetMapping("/pageWithoutCount")
public R<IPage<User>> pageWithoutCount(@RequestParam(defaultValue = "1") int current,
@RequestParam(defaultValue = "10") int size) {
Page<User> page = new Page<>(current, size, false);
IPage<User> userPage = userService.page(page);
return R.ok(userPage);
}
可以配置分页插件的最大单页限制:
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInnerInterceptor.setMaxLimit(1000L);
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
如果发现分页没有生效,请检查:
对于大数据量表的分页查询,建议:
MyBatis-Plus 的分页功能简单易用,通过配置分页插件后,可以方便地实现各种分页需求。本文介绍了基本分页查询、带条件分页、自定义SQL分页等多种使用方式,以及分页结果处理和性能优化建议。
希望本文对你理解和使用 MyBatis-Plus 的分页功能有所帮助!