【分页查询】在SSM环境中使用PageHelper


前言

本文讨论SSM框架下PageHelper的使用,SpringBoot提供的starter方式应该大同小异,用到后会在文章里更新。

一、导入jar包

<!--pagehelper-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.10</version>
        </dependency>

二、使用步骤

先给出中文文档:MyBatis 分页插件 PageHelper,如有需要可详细查阅。

下面通过一个小demo介绍如何简单使用PageHelper

三、常用配置

官方文档上有两种配置方式,笔者采用这一种:

在 Spring 配置文件中配置拦截器插件(注:也就是配置数据源的那个地方)
使用 spring 的属性配置方式,可以使用 plugins 属性像下面这样配置:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <!-- 注意其他配置 -->
  <property name="plugins">
    <array>
      <bean class="com.github.pagehelper.PageInterceptor">
        <property name="properties">
          <!--使用下面的方式配置参数,一行配置一个 -->
          <value>
            reasonable=true
          </value>
        </property>
      </bean>
    </array>
  </property>
</bean>

注意上面代码中的 reasonable=true,是可以自己配置的,所有的配置都在官方文档中写的明明白白。

笔者这里只配了reasonable=true。这个属性含义是分页参数合理化,默认值为false, 当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。

四、小案例演示最简单的分页查询

需求:实现分页查询

前端界面是长这样的
在这里插入图片描述每页有2个数据,一共n条数据,分成n/2页来查询。(本例有6条数据,分成3页查询)

而且可以显示出:第几页,共几页,有几个分类

数据库和Dao层的方法

数据库非常简单,就这么几条数据:
在这里插入图片描述

而且只用到下面这一个方法,这个方法的作用是把数据库所有东西查出来,并封装到List集合中:

List<Type> queryAllTypes();

Controller层代码:

    @GetMapping("/types")
    public String toTypes(Model model, @RequestParam(defaultValue = "1",value = "pageNum") Integer pageNum){
        /*
            PageHelper分页插件: 官方文档: https://pagehelper.github.io/docs/
            String orderBy="字段名 排序规律";
            PageHelper.startPage(pageNum, pageSize, orderBy);
         */
        String orderBy = "id desc";
        PageHelper.startPage(pageNum,2,orderBy);
        List<Type> list = typeService.queryAllTypes();
        //用PageInfo对结果进行包装
        PageInfo<Type> pageInfo = new PageInfo<Type>(list);
        System.out.println(pageInfo);
        model.addAttribute("pageInfo",pageInfo);
        return "admin/types";
    }

解释一下上面的代码。

  1. PageHelper.startPage静态方法是什么?

    官方文档给明明白白写着:
    在这里插入图片描述

  2. order by是啥意思?这个参数官方文档并没有写

    我上网查到了大神的解决方案。原博客在此

    使用它必须满足 Pagehelper的版本需在5.1.2及以上

    PageHelper.startPage(pageNum , pageSize);PageHelper.orderBy(“A B”);
    其中A为排序依据的字段名,B为排序规律,desc为降序,asc为升序

    或者一步到位

    String orderBy=“字段名 排序规律”;

    PageHelper.startPage(pageNum, pageSize, orderBy);

  3. PageInfo啥意思?

    是对结果集进行封装,这里把结果集封装后传到了html页面,下面讲html页面还会有解释。

HTML页面:

这里采用thymeleaf模板引擎。

<table class="ui compact teal table">
        <thead>
          <tr align="center">
            <th>ID</th>
            <th>名称</th>
            <th>操作</th>
          </tr>
        </thead>
        <tbody>
        <!--
            查阅thymeleaf官方文档,并搜索iterStat, 就可知道下面一行的iterStat是啥意思了
            https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html
            英文官方文档难吗?根本不难.
            要对自己的英语水平有自信心.

            注意的是 为什么是${pageInfo.list} 而不是直接 ${pageInfo}
            非常简单,只需要在后台sout一下pageInfo究竟是个什么东西就知道了:
            PageInfo{pageNum=1, pageSize=2, size=2, startRow=1, endRow=2, total=6, pages=3,
                     list=Page{count=true, pageNum=1, pageSize=2, startRow=0, endRow=2, total=6, pages=3, reasonable=true, pageSizeZero=false}
                     [Type{id=6, name='Debug专题'}, Type{id=5, name='SpringBoot'}],
                     prePage=0, nextPage=2, isFirstPage=true, isLastPage=false, hasPreviousPage=false, hasNextPage=true, navigatePages=8,
                     navigateFirstPage=1, navigateLastPage=3, navigatepageNums=[1, 2, 3]}
            分析一下里面, 有一个list字段。这就是为什么必须是${pageInfo.list}的原因了
            如果将来pageInfo里面传入的是别的属性, 需要在sout一下pageInfo,并分析出前台需要的是什么.

            By the way, 注意一个字段 reasonable=true.
            这个字段是不是很眼熟,我们在bean里面配置过了, 它生效了!


        -->
          <tr align="center" th:each="type,iterStat : ${pageInfo.list}">
            <td th:text="${iterStat.count}">1</td>
            <td th:text="${type.name}">Java专题</td>
            <td>
              <a href="#" class="ui mini teal basic button">编辑</a>
              <a href="#"  class="ui mini red basic button">删除</a>
            </td>
          </tr>
        </tbody>
        <tfoot>
          <tr>
            <th colspan="6" >
              <div class="ui inverted divided stackable grid">
                <div class="three wide column" align="center">
                  <!--
                    理论上讲,我配置了reasonable,这里不需要太多的校验(下同)
                    这里的 pageInfo. 点出来的这么多属性,从哪来的?
                    和上面一样, 在后台sout一下pageInfo究竟是个什么东西就知道了.或者直接查阅官方文档,里面就有pageInfo的属性
                  -->
                  <a class="item" th:href="@{/admin/types(pageNum=${pageInfo.prePage})}" >上一页</a>
                </div>

                <div class="ten wide column" align="center">
                  <!--这里的 pageInfo. 从哪点出来的这么多属性? 上面代码有解释-->
                  <p><span th:text="${pageInfo.pageNum}"></span> 页,共 <span th:text="${pageInfo.pages}"></span> 页,有 <span th:text="${pageInfo.total}"></span> 个分类</p>
                </div>

                <div class="three wide column" align="center">
                  <!--同様,这里因为配置了reasonable,理论上不用担心越界问题,也就用不着校验-->
                  <a class="item" th:href="@{/admin/types(pageNum=${pageInfo.nextPage})}">下一页</a>
                </div>
              </div>
              <div align="center">
              <a href="#" th:href="@{/admin/typesinput}">
                <button type="button" class="ui teal button m-mobile-wide m-margin-top"><i class="pencil icon"></i>新增</button>
              </a>
              </div>
            </th>
          </tr>
        </tfoot>
      </table>

观察上面的代码,上面的代码其实就是展示出了本文开头需求的前端页面。有两点需要说一下:

  1. PageInfo这个属性从Controller传到了前端,这玩意到底是啥意思?
    查阅官方文档,或者自己在后台systemout一下,就能看出来 pageInfo究竟是个什么东西。
    懒人们可以直接看下图,下图就是官方解释:
    在这里插入图片描述2. 还记得之前配置的reasonable=true这个属性吗?
    这个属性配置之后能大大简化前端的代码。如果不配置的话,前端的判断校验是这么写的:
    <a class="item" th:href="@{/admin/types(pageNum=${pageInfo.hasPreviousPage}?${pageInfo.prePage}:1)}" th:unless="${pageInfo.isFirstPage}">上一页</a>
                
    
    简而言之就是需要去判断有没有上一页?页码小于零咋办?如果没有下一页如何跳转?等等这些问题。一旦我们配置了reasonable,就全都解决了,一行代码就可以解决,根本不用操心上面的逻辑:
    <!--配置完reasonable之后,根本不用校验-->
    <a class="item" th:href="@{/admin/types(pageNum=${pageInfo.prePage})}" >上一页</a>
    

总结

PageHelper真是一个非常好用的东西,如果有不会的地方,一定要看官方文档,写的通俗易懂。而且一共就一点内容,就算全看完也不用多少时间,别怕。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSM(Spring + SpringMVC + MyBatis使用PageHelper进行分页查询是一种常见的做法。以下是使用PageHelper实现分页查询的步骤: 1. 首先,在项目的依赖管理添加PageHelper的相关依赖。你可以在pom.xml文件添加以下依赖: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>版本号</version> </dependency> ``` 请注意,将“版本号”替换为PageHelper的最新版本号。 2. 在Spring配置文件(例如applicationContext.xml)配置PageHelper的插件。添加以下配置: ```xml <bean id="pageHelper" class="com.github.pagehelper.PageHelper"> <property name="dialect" value="mysql"/> </bean> ``` 请注意,这里的dialect属性值可能需要根据你使用数据库类型进行相应的设置。 3. 在你的DAO层接口,添加使用PageHelper进行分页查询的方法。例如: ```java List<Entity> findEntitiesByPage(int pageNum, int pageSize); ``` 4. 在DAO层的XML映射文件使用PageHelper提供的插件进行分页查询。在查询语句之前添加以下配置: ```xml <select id="findEntitiesByPage" parameterType="map" resultMap="entityResultMap"> <!-- 此处为PageHelper提供的插件 --> <include refid="PageHelper.startPage"/> SELECT * FROM your_table <!-- 此处为PageHelper提供的插件 --> <include refid="PageHelper.endPage"/> </select> ``` 请注意,将"your_table"替换为你的实际表名,并且确保映射文件已定义相应的结果映射。 5. 在Service层或Controller层调用DAO层的分页查询方法,传入页码和每页大小参数。 这样,你就可以使用PageHelper实现SSM分页查询了。记得在每次查询之后,需要手动清除ThreadLocal的分页参数,以免对其他查询产生影响: ```java PageHelper.clearPage(); ``` 希望能对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值