Springboot中使用pageHelper插件

Springboot中使用pageHelper插件

​ 都知道pagehelper是一个MyBatis的分页插件,其实在如今的前后端分离项目中,我们使用该插件的机会并不多。但我还是觉得这部分内容还是应该学习和掌握的,毕竟我们应该善其身而兼济天下。

​ ok,我准备从以下几个方面来说一下pagehelper。

  1. 优点

    无需你自己去封装以及关心sql分页等问题,使用很方便,前端取数据也很方便。

    我们都知道传统的SQL分页逻辑,Mysql的话要使用limit子句来限制每次读取的记录数以及每次开始读取的位置,多次的sql语句查询是不可避免的,甚至是pagehelper也是一样,不同的是,pagehelper只需要传入第几页以及每页记录数,当调用startPage方法后,会返回一个Page集合,该集合中会包含许多我们需要的数据,总记录条数,分出的总页数等等。而这些内容,使用传统方式,仍然还是需要再度进行数据库查询,执行效率自不必说。

    在这里插入图片描述

  2. 如何使用

    1. 引入(maven方式)

       		<dependency>
                  <groupId>com.github.pagehelper</groupId>
                  <artifactId>pagehelper-spring-boot-starter</artifactId>
                  <version>1.2.10</version>
              </dependency>
      
    2. service层使用

       public pageDTO getPage(Integer page, Integer size) {
              pageDTO pageDTO = new pageDTO();
      
              Page<Object> objects = PageHelper.startPage(page, size, true);
              List<QuestionDTO> questions = getAll();
              PageInfo<QuestionDTO> pageInfo = new PageInfo<>(questions);
           
      		//容错处理
              if(page>=objects.getPages()){
                  page=objects.getPages();
              }
              if(page<=0){
                  page=1;
              }
      		//需要使用的page对象中的信息,需要在两次sql查询结束之后在进行,否则取到的结果就是当前页的结果。
              pageDTO.setNowPage(page);
              pageDTO.setTotalPage(objects.getPages());
              pageDTO.setSinglePage(page,(int) objects.getPages());
              pageDTO.setQuestions(pageInfo.getList());
      
              return pageDTO;
          }
      

      我在该部分使用的pageDTO用于数据封装,可不做理解(大后端技术,数据封装处理基本交由后端完成)。

为凑篇幅,下面部分开始偏题

页面查询数据的封装,主要是为了封装首尾页以及上下页。

@Component
@Data
public class pageDTO {
    private List<QuestionDTO> questions = new ArrayList<>();
    private boolean hasPrevious=true;//上一页
    private boolean hasNext=true;//下一页
    private boolean showFirstPage=true;//首页
    private boolean showEndPage=true;//尾页
    private Integer totalPage;//总页数

    private Integer nowPage;
    private List<Integer> pages = new ArrayList<>();

    public void setSinglePage(int page,int total){
        //第一页不含有首页和上一页的选项
        if(nowPage==1){
            hasPrevious=false;
        }
        if(nowPage==total){
            hasNext=false;
        }
        //尾页与首页相反
        if(pages.contains(1)){
            showFirstPage = false;
        }
        if(pages.contains(total)){
            showEndPage = false;
        }

        pages.add(page);
        //页面列表的封装逻辑
        for(int i=1;i<=3;i++){
            if(page-i>0){
                pages.add(0,page-i);
            }
            if(page+i<=total){
                pages.add(page+i);
            }
        }
    }
}

前端展示

 <ul class="pagination">
                    <li th:if="${questionList.showFirstPage}">
                        <a href="/index?page=1" aria-label="Previous">
                            <span aria-hidden="true">&laquo;</span>
                        </a>
                    </li>
                    <li th:if="${questionList.hasPrevious}">
                        <a th:href="@{/index(page=${questionList.nowPage}-1)}" aria-label="Previous">
                            <span aria-hidden="true">&lt;</span>
                        </a>
                    </li>

                    <li th:each="page:${questionList.pages}" >
                        <a th:href="@{/index(page=${page})}" th:if="${page}==${questionList.nowPage}" class="active">[[${page}]]</a>
                        <a th:href="@{/index(page=${page})}" th:if="${page}!=${questionList.nowPage}">[[${page}]]</a>
                    </li>


                    <li th:if="${questionList.hasNext}">
                        <a th:href="@{/index(page=${questionList.totalPage})}" aria-label="Previous">
                            <span aria-hidden="true">&gt;</span>
                        </a>
                    </li>
                    <li th:if="${questionList.showEndPage}">
                        <a th:href="@{/index(page=${questionList.nowPage}+1)}" aria-label="Next">
                            <span aria-hidden="true">&raquo;</span>
                        </a>
                    </li>

                </ul>

效果不截图。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值