Bootstrap

PageHelper的分页条件查询

PageHelper的分页条件查询

  • 导入依赖
<!--分页查询插件-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.6</version>
        </dependency>
  • 配置参数
#配置方言属性和自动更正不合理分页参数
pagehelper:
  helper-dialect: mysql
  reasonable: true
  • pojo类

    /**
     * 菜品
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class Dish implements Serializable {
        private static final long serialVersionUID = 1L;
        private Long id;
        //菜品名称
        private String name;
        //菜品分类id
        private Long categoryId;
        //菜品价格(数据库中为decimal(10,2))
        private BigDecimal price;
        //图片
        private String image;
        //描述信息
        private String description;
        //0 停售 1 起售
        private Integer status;
        private LocalDateTime createTime;
        private LocalDateTime updateTime;
        private Long createUser;
        private Long updateUser;
    }
    
  • 前端参数封装

    @Data
    public class DishPageQueryDTO implements Serializable {
        //第几页
        private int page;
        //查多少
        private int pageSize;
        //ca
        private String name;
        //分类id
        private Integer categoryId;
        //状态 0表示禁用 1表示启用
        private Integer status;
    }
    
    
  • 返回结果封装

    /**
     * 封装分页查询结果
     */
    @Data
    //用有参构造方法把两个参数引入封装
    @AllArgsConstructor
    @NoArgsConstructor
    public class PageResult implements Serializable {
        private long total; //总记录数
        private List records; //当前页数据集合
    }
    
  • controller层

    /**
         * 菜品分页查询接口
         * 不用加@RequestBody
         * @param dishPageQueryDTO
         * @return
         */
        @GetMapping("/page")
        @ApiOperation("菜品分页查询")
        public Result<PageResult> page(DishPageQueryDTO dishPageQueryDTO){
            log.info("菜品分页查询:{}",dishPageQueryDTO);
            PageResult pageResult=dishService.pageDish(dishPageQueryDTO);
            return Result.success(pageResult);
        }
    
  • service及其实现

    /**
         * 菜品分页查询
         * @param dishPageQueryDTO
         */
        PageResult pageDish(DishPageQueryDTO dishPageQueryDTO);
    
    
    /**
         * 菜品分页查询
         * @param dishPageQueryDTO
         */
        @Override
        public PageResult pageDish(DishPageQueryDTO dishPageQueryDTO) {
            //开启分页查询PageHelper(要导入对应坐标)
            //开始分页查询,第几页查多少,把页码和页数传递
            //这个插件底层是基于mybatis的拦截器,把后面的sql进行拼接;相当于sql中的limit关键字拼接,根据两个参数进行动态计算【即字符串的拼接交给插件去做】
      PageHelper.startPage(dishPageQueryDTO.getPage(),dishPageQueryDTO.getPageSize());
            //在数据层中要取name和categoryId,条件限制
            Page<DishVO> page=dishMapper.pageQuery(dishPageQueryDTO);
            //获取数据封装返回
            return new PageResult(page.getTotal(),page.getResult());
        }
    
    • 注意:Page<DishVO> page=dishMapper.pageQuery(dishPageQueryDTO);相当于:

      List<Dish> dish=dishMapper.pageQuery(dishPageQueryDTO); Page<Dish> page=(Page<Dish>) dish

      Page中提供中提供了方法,可以获取PageHelper分页查询后,得到的总记录条数和当前页条数;需要将查询到的List<Dish>数据强转为Page<Dish>类型,然后分别取出page对象中的总条数当前数据封装返回

  • mapper(.java与.xml)

    /**
         * 分页查询菜品
         * @param dishPageQueryDTO
         * @return
         */
        Page<DishVO> pageQuery(DishPageQueryDTO dishPageQueryDTO);
    
    <!--条件查询-->
        <select id="list" resultType="Dish">
            select * from dish
            <where>
                <if test="categoryId!=null">
                    and category_id=#{categoryId}
                </if>
                <if test="status!=null">
                    and status=#{status}
                </if>
            </where>
        </select>
    
;