大家好 , 我是苏麟 , 今天聊一聊分页功能 .
Page分页构造器是mybatisplus包中的一个分页类 .
引入依赖
-
-
com.baomidou -
mybatis-plus-boot-starter -
3.4.1 -
-
-
-
com.alibaba -
druid -
1.1.16 -
配置
- /**
- * 配置MP的分页插件
- */
- @Configuration
- public class MybatisPlusConfig {
-
- @Bean
- public MybatisPlusInterceptor mybatisPlusInterceptor(){
- MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
- mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
- return mybatisPlusInterceptor;
- }
- }
分页查询的实现
- /**
- * 分页查询
- * @param page
- * @param pageSize
- * @param name
- * @return
- */
- @GetMapping("/page")
- public R
page(@RequestParam(required = false, defaultValue = "1") int page, - @RequestParam(required = false, defaultValue = "10") int pageSize,
- String name){
- log.info("page = {},pageSize = {},name = {}" ,page,pageSize,name);
-
- //构造分页构造器
- Page pageInfo = new Page(page,pageSize);
-
- //构造条件构造器
- LambdaQueryWrapper
queryWrapper = new LambdaQueryWrapper(); - //添加过滤条件
- queryWrapper.like(StringUtils.isNotEmpty(name),Employee::getName,name);
- //添加排序条件
- queryWrapper.orderByDesc(Employee::getUpdateTime);
-
- //执行查询
- employeeService.page(pageInfo,queryWrapper);
-
- return R.success(pageInfo);
- }
无条件查询
- @GetMapping("/page")
- public R
page(int page,int pageSize,String name){ -
- //构造分页构造器对象
- Page pageInfo = new Page<>(page,pageSize);
-
-
- //执行分页查询
- dishService.page(pageInfo, null);
-
- return R.success(page);
- }
PageHelper官网 : MyBatis 分页插件 PageHelper
开始使用
引入依赖
-
-
-
com.github.pagehelper -
pagehelper-spring-boot-starter -
1.4.6 -
在spring boot 配置
Spring Boot 引入 starter 后自动生效,对分页插件进行配置时,在 Spring Boot 对应的配置文件中配置:
properties :
- pagehelper.propertyName=propertyValue
- pagehelper.reasonable=false
- pagehelper.defaultCount=true
yml :
- pagehelper:
- propertyName: propertyValue
- reasonable: false
- defaultCount: true # 分页插件默认参数支持 default-count 形式,自定义扩展的参数,必须大小写一致
准备一些数据
测试
- @Test
- void mybatisTest() {
- PageHelper.startPage(1,2);
- Page
list = (Page) userMapper.list(); - System.out.println(list);
- }
测试结果
分页插件还支持的几种方法(官方给出的方式)
- //第一种,RowBounds方式的调用
- List
list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10)); -
- //第二种,Mapper接口方式的调用,推荐这种使用方式。
- PageHelper.startPage(1, 10);
- List
list = userMapper.selectIf(1); -
- //第三种,Mapper接口方式的调用,推荐这种使用方式。
- PageHelper.offsetPage(1, 10);
- List
list = userMapper.selectIf(1); -
- //第四种,参数方法调用
- //存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
- public interface CountryMapper {
- List
selectByPageNumSize( - @Param("user") User user,
- @Param("pageNum") int pageNum,
- @Param("pageSize") int pageSize);
- }
- //配置supportMethodsArguments=true
- //在代码中直接调用:
- List
list = userMapper.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
selectByPageNumSize(User user); - }
- //当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
- List
list = userMapper.selectByPageNumSize(user); -
- //第六种,ISelect 接口方式
- //jdk6,7用法,创建接口
- Page
page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() { - @Override
- public void doSelect() {
- userMapper.selectGroupBy();
- }
- });
- //jdk8 lambda用法
- Page
page = PageHelper.startPage(1, 10).doSelectPage(()-> userMapper.selectGroupBy()); -
- //也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
- pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
- @Override
- public void doSelect() {
- userMapper.selectGroupBy();
- }
- });
- //对应的lambda用法
- pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> userMapper.selectGroupBy());
-
- //count查询,返回一个查询语句的count数
- long total = PageHelper.count(new ISelect() {
- @Override
- public void doSelect() {
- userMapper.selectLike(user);
- }
- });
- //lambda
- total=PageHelper.count(()->userMapper.selectLike(user));
更详细的请看官方文档 .
例子 :
前提条件
- @Data
- public class EmployeePageQueryDTO implements Serializable {
-
- //员工姓名
- private String name;
-
- //页码
- private int page;
-
- //每页显示记录数
- private int pageSize;
-
- }
- /**
- * 封装分页查询结果
- */
- @Data
- @AllArgsConstructor
- @NoArgsConstructor
- public class PageResult implements Serializable {
-
- private long total; //总记录数
-
- private List records; //当前页数据集合
-
- }
代码 :
- /**
- * 员工分页查询
- * @param employeePageQueryDTO
- * @return
- */
- @GetMapping("/page")
- @ApiOperation(value = "员工分页查询功能")
- public Result
page(EmployeePageQueryDTO employeePageQueryDTO) { - log.info("员工分页参数 : {}", employeePageQueryDTO);
- PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO);
- return Result.success(pageResult);
- }
- /**
- * 员工分页查询
- *
- * @param employeePageQueryDTO
- * @return
- */
- @Override
- public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {
- //开始分页查询
- PageHelper.startPage(employeePageQueryDTO.getPage(), employeePageQueryDTO.getPageSize());
-
- Page
page = employeeMapper.pageQuery(employeePageQueryDTO); -
- long total = page.getTotal();
- List
result = page.getResult(); - return new PageResult(total,result);
- }
PageHelper 自动添加 limit 所以直接用就好了 .
-
-
- select * from employee
-
- <if test="name != null and name != ''">
- and name like concat('%',#{name},'%')
- if>
-
- order by create_time desc
-
这期就到这里 , 下期见 !
拜拜 !