zoukankan      html  css  js  c++  java
  • spring boot学习 ---- 使用pageHelper实现分页功能

    目录

      1.介绍pageHelper

      2.pageHelper的基本配置

      3.使用pageHelper实现分页功能

    一、介绍pageHelper

      pageHelper是一款分页插件,它能很好的集成在spring boot中在它是一个基于mybatis的一款插件。它是的底层实现技术则是使用动态代理实现的。所以我们在使用它时,我们需要使用mybatis作为持久层框架。如果有需要请参照《spring boot 集成 mybatis》

    二、pageHelper的基本配置

      如果我们需要使用pageHelper的话,我们需要在spring boot项目中引入pageHelper的依赖。以下是PageHelper的GitHub地址https://github.com/pagehelper/Mybatis-PageHelper

      在这里我们导入以下依赖:

    <!-- pagehelper -->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>1.2.5</version>
            </dependency>

      同样,我们在spring boot的application.properties中可以配置pageHelper的基本信息,

    # 指定数据库,不指定的话会默认自动检测数据库类型
    pagehelper.helperDialect=mysql
    # 是否启用分页合理化。
    # 如果启用,当pagenum<1时,会自动查询第一页的数据,当pagenum>pages时,自动查询最后一页数据;
    # 不启用的,以上两种情况都会返回空数据
    pagehelper.reasonable=true
    # 默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。
    pagehelper.supportMethodsArguments=true
    # 用于从对象中根据属性名取值,
    # 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值,
    # 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
    pagehelper.params=count=countSql

      在1.2.5这个版本中我们可以不用配置,使用默认的就够用了。

    三、使用pageHelper实现分页功能

      在上一步中,我们已近知道pageHelper的基本配置了。在这,我们使用pageHelper实现分页功能。

    我们使用《mysql必知必会》中给出的数据库进行分页查询。

      1.创建City实体类

    package com.springboot.pagehelper;
    
    public class City {
    //    id
        private int id;
    //    国家名
        private String name;
    //    国家代码
        private String countryCode;
    //    地区
        private String district;
    //    人口
        private int population;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getCountryCode() {
            return countryCode;
        }
    
        public void setCountryCode(String countryCode) {
            this.countryCode = countryCode;
        }
    
        public String getDistrict() {
            return district;
        }
    
        public void setDistrict(String district) {
            this.district = district;
        }
    
        public int getPopulation() {
            return population;
        }
    
        public void setPopulation(int population) {
            this.population = population;
        }
    }
    City

      2.数据操作层查询出所有数据

    package com.springboot.pagehelper.mapper;
    
    import com.springboot.pagehelper.City;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Result;
    import org.apache.ibatis.annotations.Results;
    import org.apache.ibatis.annotations.Select;
    import org.springframework.stereotype.Repository;
    
    import java.util.List;
    
    @Mapper
    @Repository
    public interface CityMapper {
    //    获取所有城市
        @Select("select * from city")
        @Results({
                @Result(property = "id",column = "ID"),
                @Result(property = "name",column = "Name"),
                @Result(property = "countryCode",column = "CountryCode"),
                @Result(property = "district",column = "District"),
                @Result(property = "population",column = "Population")
        })
        List<City> selectCity();
    }
    CityMapper

      3.创建业务接口

      这里我们使用两种实现

    package com.springboot.pagehelper.service;
    
    import com.github.pagehelper.Page;
    import com.springboot.pagehelper.City;
    
    import java.util.List;
    
    public interface CityService {
        List<City> getcity();
        Page<City> pageCity();
    }
    CityService

      4.实现业务接口

    package com.springboot.pagehelper.service;
    
    import com.github.pagehelper.Page;
    import com.springboot.pagehelper.City;
    import com.springboot.pagehelper.mapper.CityMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    @Service
    public class CityServiceImpl implements  CityService {
    
        @Autowired
        private CityMapper mapper;
    
        @Override
        public List<City> getcity() {
            return mapper.selectCity();
        }
    
        @Override
        public Page<City> pageCity() {
            return (Page<City>)mapper.selectCity();
        }
    }
    CityServiceImpl

      5.控制层实现分页

    package com.springboot.pagehelper.controller;
    
    import com.github.pagehelper.PageHelper;
    import com.github.pagehelper.PageInfo;
    import com.springboot.pagehelper.City;
    import com.springboot.pagehelper.service.CityService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    @RestController
    public class DataController {
        @Autowired
        private CityService service;
        @GetMapping("/citys/{page}")
        public PageInfo<City> lists(@PathVariable int page){
    //        设置分页规则
            PageHelper.startPage(page,10);
    //        返回所有分页信息参数为查询所有记录的信息
            PageInfo<City> pageInfo = new PageInfo<>(service.pageCity());
            return pageInfo;
        }
    
        @GetMapping("/city")
        public List<City> paraList(@RequestParam(defaultValue = "1") int p,
                                   @RequestParam(defaultValue = "10") int size){
    //        设置分页规则
            PageHelper.startPage(p,size);
    //        取数据,插件会自动按照规则分页显示数据
            return service.getcity();
        }
    }
    DataController

      实现分页功能在使用时,PageInfo源码如下:

    /*
     * The MIT License (MIT)
     *
     * Copyright (c) 2014-2017 abel533@gmail.com
     *
     * Permission is hereby granted, free of charge, to any person obtaining a copy
     * of this software and associated documentation files (the "Software"), to deal
     * in the Software without restriction, including without limitation the rights
     * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     * copies of the Software, and to permit persons to whom the Software is
     * furnished to do so, subject to the following conditions:
     *
     * The above copyright notice and this permission notice shall be included in
     * all copies or substantial portions of the Software.
     *
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     * THE SOFTWARE.
     */
    
    package com.github.pagehelper;
    
    import java.io.Serializable;
    import java.util.Collection;
    import java.util.List;
    
    /**
     * 对Page<E>结果进行包装
     * <p/>
     * 新增分页的多项属性,主要参考:http://bbs.csdn.net/topics/360010907
     *
     * @author liuzh/abel533/isea533
     * @version 3.3.0
     * @since 3.2.2
     * 项目地址 : http://git.oschina.net/free/Mybatis_PageHelper
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    public class PageInfo<T> extends PageSerializable<T> {
        //当前页
        private int pageNum;
        //每页的数量
        private int pageSize;
        //当前页的数量
        private int size;
    
        //由于startRow和endRow不常用,这里说个具体的用法
        //可以在页面中"显示startRow到endRow 共size条数据"
    
        //当前页面第一个元素在数据库中的行号
        private int startRow;
        //当前页面最后一个元素在数据库中的行号
        private int endRow;
        //总页数
        private int pages;
    
        //前一页
        private int prePage;
        //下一页
        private int nextPage;
    
        //是否为第一页
        private boolean isFirstPage = false;
        //是否为最后一页
        private boolean isLastPage = false;
        //是否有前一页
        private boolean hasPreviousPage = false;
        //是否有下一页
        private boolean hasNextPage = false;
        //导航页码数
        private int navigatePages;
        //所有导航页号
        private int[] navigatepageNums;
        //导航条上的第一页
        private int navigateFirstPage;
        //导航条上的最后一页
        private int navigateLastPage;
    
        public PageInfo() {
        }
    
        /**
         * 包装Page对象
         *
         * @param list
         */
        public PageInfo(List<T> list) {
            this(list, 8);
        }
    
        /**
         * 包装Page对象
         *
         * @param list          page结果
         * @param navigatePages 页码数量
         */
        public PageInfo(List<T> list, int navigatePages) {
            super(list);
            if (list instanceof Page) {
                Page page = (Page) list;
                this.pageNum = page.getPageNum();
                this.pageSize = page.getPageSize();
    
                this.pages = page.getPages();
                this.size = page.size();
                //由于结果是>startRow的,所以实际的需要+1
                if (this.size == 0) {
                    this.startRow = 0;
                    this.endRow = 0;
                } else {
                    this.startRow = page.getStartRow() + 1;
                    //计算实际的endRow(最后一页的时候特殊)
                    this.endRow = this.startRow - 1 + this.size;
                }
            } else if (list instanceof Collection) {
                this.pageNum = 1;
                this.pageSize = list.size();
    
                this.pages = this.pageSize > 0 ? 1 : 0;
                this.size = list.size();
                this.startRow = 0;
                this.endRow = list.size() > 0 ? list.size() - 1 : 0;
            }
            if (list instanceof Collection) {
                this.navigatePages = navigatePages;
                //计算导航页
                calcNavigatepageNums();
                //计算前后页,第一页,最后一页
                calcPage();
                //判断页面边界
                judgePageBoudary();
            }
        }
    
        public static <T> PageInfo<T> of(List<T> list){
            return new PageInfo<T>(list);
        }
    
        public static <T> PageInfo<T> of(List<T> list, int navigatePages){
            return new PageInfo<T>(list, navigatePages);
        }
    
        /**
         * 计算导航页
         */
        private void calcNavigatepageNums() {
            //当总页数小于或等于导航页码数时
            if (pages <= navigatePages) {
                navigatepageNums = new int[pages];
                for (int i = 0; i < pages; i++) {
                    navigatepageNums[i] = i + 1;
                }
            } else { //当总页数大于导航页码数时
                navigatepageNums = new int[navigatePages];
                int startNum = pageNum - navigatePages / 2;
                int endNum = pageNum + navigatePages / 2;
    
                if (startNum < 1) {
                    startNum = 1;
                    //(最前navigatePages页
                    for (int i = 0; i < navigatePages; i++) {
                        navigatepageNums[i] = startNum++;
                    }
                } else if (endNum > pages) {
                    endNum = pages;
                    //最后navigatePages页
                    for (int i = navigatePages - 1; i >= 0; i--) {
                        navigatepageNums[i] = endNum--;
                    }
                } else {
                    //所有中间页
                    for (int i = 0; i < navigatePages; i++) {
                        navigatepageNums[i] = startNum++;
                    }
                }
            }
        }
    
        /**
         * 计算前后页,第一页,最后一页
         */
        private void calcPage() {
            if (navigatepageNums != null && navigatepageNums.length > 0) {
                navigateFirstPage = navigatepageNums[0];
                navigateLastPage = navigatepageNums[navigatepageNums.length - 1];
                if (pageNum > 1) {
                    prePage = pageNum - 1;
                }
                if (pageNum < pages) {
                    nextPage = pageNum + 1;
                }
            }
        }
    
        /**
         * 判定页面边界
         */
        private void judgePageBoudary() {
            isFirstPage = pageNum == 1;
            isLastPage = pageNum == pages || pages == 0;;
            hasPreviousPage = pageNum > 1;
            hasNextPage = pageNum < pages;
        }
    
        public int getPageNum() {
            return pageNum;
        }
    
        public void setPageNum(int pageNum) {
            this.pageNum = pageNum;
        }
    
        public int getPageSize() {
            return pageSize;
        }
    
        public void setPageSize(int pageSize) {
            this.pageSize = pageSize;
        }
    
        public int getSize() {
            return size;
        }
    
        public void setSize(int size) {
            this.size = size;
        }
    
        public int getStartRow() {
            return startRow;
        }
    
        public void setStartRow(int startRow) {
            this.startRow = startRow;
        }
    
        public int getEndRow() {
            return endRow;
        }
    
        public void setEndRow(int endRow) {
            this.endRow = endRow;
        }
    
        public int getPages() {
            return pages;
        }
    
        public void setPages(int pages) {
            this.pages = pages;
        }
    
        @Deprecated
        // firstPage就是1, 此函数获取的是导航条上的第一页, 容易产生歧义
        public int getFirstPage() {
            return navigateFirstPage;
        }
    
        @Deprecated
        public void setFirstPage(int firstPage) {
            this.navigateFirstPage = firstPage;
        }
    
        public int getPrePage() {
            return prePage;
        }
    
        public void setPrePage(int prePage) {
            this.prePage = prePage;
        }
    
        public int getNextPage() {
            return nextPage;
        }
    
        public void setNextPage(int nextPage) {
            this.nextPage = nextPage;
        }
    
        @Deprecated
        // 请用getPages()来获取最后一页, 此函数获取的是导航条上的最后一页, 容易产生歧义.
        public int getLastPage() {
            return navigateLastPage;
        }
    
        @Deprecated
        public void setLastPage(int lastPage) {
            this.navigateLastPage = lastPage;
        }
    
        public boolean isIsFirstPage() {
            return isFirstPage;
        }
    
        public void setIsFirstPage(boolean isFirstPage) {
            this.isFirstPage = isFirstPage;
        }
    
        public boolean isIsLastPage() {
            return isLastPage;
        }
    
        public void setIsLastPage(boolean isLastPage) {
            this.isLastPage = isLastPage;
        }
    
        public boolean isHasPreviousPage() {
            return hasPreviousPage;
        }
    
        public void setHasPreviousPage(boolean hasPreviousPage) {
            this.hasPreviousPage = hasPreviousPage;
        }
    
        public boolean isHasNextPage() {
            return hasNextPage;
        }
    
        public void setHasNextPage(boolean hasNextPage) {
            this.hasNextPage = hasNextPage;
        }
    
        public int getNavigatePages() {
            return navigatePages;
        }
    
        public void setNavigatePages(int navigatePages) {
            this.navigatePages = navigatePages;
        }
    
        public int[] getNavigatepageNums() {
            return navigatepageNums;
        }
    
        public void setNavigatepageNums(int[] navigatepageNums) {
            this.navigatepageNums = navigatepageNums;
        }
    
        public int getNavigateFirstPage() {
            return navigateFirstPage;
        }
    
        public int getNavigateLastPage() {
            return navigateLastPage;
        }
    
        public void setNavigateFirstPage(int navigateFirstPage) {
            this.navigateFirstPage = navigateFirstPage;
        }
    
        public void setNavigateLastPage(int navigateLastPage) {
            this.navigateLastPage = navigateLastPage;
        }
    
        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder("PageInfo{");
            sb.append("pageNum=").append(pageNum);
            sb.append(", pageSize=").append(pageSize);
            sb.append(", size=").append(size);
            sb.append(", startRow=").append(startRow);
            sb.append(", endRow=").append(endRow);
            sb.append(", total=").append(total);
            sb.append(", pages=").append(pages);
            sb.append(", list=").append(list);
            sb.append(", prePage=").append(prePage);
            sb.append(", nextPage=").append(nextPage);
            sb.append(", isFirstPage=").append(isFirstPage);
            sb.append(", isLastPage=").append(isLastPage);
            sb.append(", hasPreviousPage=").append(hasPreviousPage);
            sb.append(", hasNextPage=").append(hasNextPage);
            sb.append(", navigatePages=").append(navigatePages);
            sb.append(", navigateFirstPage=").append(navigateFirstPage);
            sb.append(", navigateLastPage=").append(navigateLastPage);
            sb.append(", navigatepageNums=");
            if (navigatepageNums == null) {
                sb.append("null");
            } else {
                sb.append('[');
                for (int i = 0; i < navigatepageNums.length; ++i) {
                    sb.append(i == 0 ? "" : ", ").append(navigatepageNums[i]);
                }
                sb.append(']');
            }
            sb.append('}');
            return sb.toString();
        }
    }
    PageInfo

      它包括了许多分页信息,我们可以获取所有分页信息,发到前端,最后渲染到页面上。

      之后我们可以通过浏览器来获取到我们的数据了。

    第一个版本(传参方式):

    第二个版本(改变地址栏):

       到这就完成了分页的功能。

  • 相关阅读:
    又玩起了“数独”
    WebService应用:音乐站图片上传
    大家都来DIY自己的Blog啦
    CSS导圆角,不过这个代码没有怎么看懂,与一般的HTML是不同
    网站PR值
    CommunityServer2.0何去何从?
    网络最经典命令行
    炎热八月,小心"落雪"
    Topology activation failed. Each partition must have at least one index component from the previous topology in the new topology, in the same host.
    SharePoint 2013服务器场设计的一些链接
  • 原文地址:https://www.cnblogs.com/bananafish/p/10481798.html
Copyright © 2011-2022 走看看