Spring/SpringBoot-PageHelper(分页)

1. PageHelper

1.1 PageHelper 是什么

PageHelper:MyBatis 的一个分页插件。

 

1.2 Maven 依赖

PageHelper 的实现依赖自 com.github.pagehelper

PageHelper on GitHub : PageHelper

Spring:

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.2.0</version>
</dependency>

Spring Boot :

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

1.3 PageHelper 配置

使用 PageHelper 时,我们常常需要单独配置它的属性,在 Spring Boot 与 Spring 中配置方法有所不同。

🔻 Using in mybatis-config.xml

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!-- config params as the following -->
        <property name="param1" value="value1"/>
	</plugin>
</plugins>

🔻 Using in Spring application.xml

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <!-- other configuration -->
  <property name="plugins">
    <array>
      <bean class="com.github.pagehelper.PageInterceptor">
        <property name="properties">
          <!-- config params as the following -->
          <value>
            param1=value1
          </value>
        </property>
      </bean>
    </array>
  </property>
</bean>

🔻 Using in Spring Boot application.yml

pagehelper:
  param1: value1
  param2: value2
  ...

1.4 PageHelper 属性

PageHelper 为我们提供了许多可配置的属性,具体配置时根据环境的不同选择上方的配置方法。

配置的属性类实现自 Dialect 接口,想要自定义属性可以实现该接口!PageHelper 类也是是实现了该接口。

🔻 常用属性:

  • helperDialect:配置数据库类型,由此自动选择合适的分页方式。

    • Options:oraclemysqldb2sqlserver
  • reasonable:分页合理化参数,默认值为false

    • false:直接根据参数进行查询
    • true:pageNum<=0 时会查询第一页, pageNum>pages(总页数),会查询最后一页
  • params:为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值

    • Options:pageNumpageSizecountpageSizeZeroreasonable
    • Default:pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
  • supportMethodsArguments:支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据 params 配置的字段中取值,查找到合适的值时就会自动分页

  • pageSizeZero:默认值为 false

    • true:如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果

🔻 其他属性:

  • offsetAsPageNum:默认值为 false,该参数对使用 RowBounds 作为分页参数时有效
    • true:会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页
  • rowBoundsWithCount:默认值为false,该参数对使用 RowBounds 作为分页参数时有效。
    • true:使用 RowBounds 分页会进行 count 查询
  • autoRuntimeDialect:默认值为 false
    • true:允许在运行时根据多数据源自动识别对应方言的分页
  • closeConn:默认值为 true
    • true:当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接
    • false:不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。

2. Spring 中使用

下面将在SSM框架中使用 PageHelper!

IDEA:2021.2

Tomcat:8.5.39

Maven:3.8.2

PageHelper:5.2.0

依赖:

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.2.0</version>
</dependency>

2.1 配置属性

在 Spring 的配置文件中配置属性。

ApplicationContext.xml

<!--    配置sqlSessionFactoryBean-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <property name="mapperLocations" value="classpath*:com/Mapper/*.xml"/>

    <!--      分页插件  -->
    <property name="plugins">
        <array>
            <bean class="com.github.pagehelper.PageInterceptor">
                <property name="properties">
                    <props>
                        <!-- 设置使用的是那个数据库-->
                        <prop key="helpDialect">mysql</prop>
                        <!--设置可以默认可以处理页面异常 -->
                        <prop key="reasonable">true</prop>
                    </props>
                </property>
            </bean>
        </array>
    </property>

</bean>

2.2 Service

我们不需要修改Mapper中的东西,但需要保证我们已经有了全查的方法。

在 Service 接口中添加一个抽象方法:

PageInfo<User> queryList(Integer pageNum, Integer pageSize);

pageNum:分页后的页数

pageSize:每页数据记录的条数

PageInfo 中还有很多的参数,就不一一举例了!

2.3 ServiceImpl

在 Service 的实现类中,实现上面写的抽象方法:

public PageInfo<User> queryList(Integer pageNum, Integer pageSize) {
    // 如果使用分页,先调用startPage
    PageHelper.startPage(pageNum,pageSize);
    // 调取Mapper的getAllUser方法,查询所有数据
    List<User> allUser = userMapper.getAllUser();
    // 将所有数据放入到分页类中
    PageInfo<User> userPageInfo = new PageInfo<>(allUser, pageSize);
    return userPageInfo;
}

2.4 Controller

@RequestMapping("/getAllUser")
public String getAllUser(Model model, HttpServletRequest request){

    // 获取页面传入的页面编号,若值为空则赋1,否则将获取页面编号赋给pageNum
    int pageNum = request.getParameter("pageNum")==null ? 1 : Integer.valueOf( request.getParameter("pageNum"));
    
    // 每页显示几条数据
    int pageSize = 3; 

    // 存放当前页显示的信息
    PageInfo<User> pageInfo = userService.queryList(pageNum, pageSize);

    // 当前的总页数
    model.addAttribute("pages",pageInfo.getPages());

    // 获取当前页码
    model.addAttribute("pageNum",pageInfo.getPageNum());

    // 获取前端页面显示的数量
    model.addAttribute("pageSize",pageInfo.getPageSize());

    model.addAttribute("userList",pageInfo.getList());

    return "userlist";
}

2.5 JSP

JSP中添加如下div(应该能看懂吧):

<div>
    <span>共${pages}页</span>
    <span>当前第${pageNum}页</span>
    <span>
        <a href="${pageContext.request.contextPath}/getAllUser?pageNum=1">首页</a>
    </span>
    <span>
        <c:if test="${pageNum!=1}">
            <a href="${pageContext.request.contextPath}/getAllUser?pageNum=${pageNum-1}">|上一页</a>
        </c:if>
    </span>
    |
    <span>
        <c:if test="${pageNum<pages}">
            <a href="${pageContext.request.contextPath}/getAllUser?pageNum=${pageNum+1}">下一页|</a>
        </c:if>
    </span>
    <span>
        <a href="${pageContext.request.contextPath}/getAllUser?pageNum=${pages}">尾页</a>
    </span>
</div>

2.6 测试

1028springpage

3. Spring Boot 中使用

依赖:

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

3.1 配置属性

在 Spring Boot 的配置文件中配置属性。

application.yml

pagehelper:
  helper-dialect: mysql
  reasonable: true
  support-methods-arguments: true
  page-size-zero: true

3.2 Service

PageInfo<Employee> queryList(Integer pageNum, Integer pageSize);

3.3 ServiceImpl

@Override
public PageInfo<Employee> queryList(Integer pageNum, Integer pageSize) {
    // 如果要使用分页,先调用startPage方法
    PageHelper.startPage(pageNum, pageSize);
    // 查询所有数据
    List<Employee> all = getAll();
    // 将所有的数据存放至分页的类中
    PageInfo<Employee> pageInfo = new PageInfo<>(all, pageSize);
    return pageInfo;
}

3.4 Controller

@RequestMapping("/emps")
public String list(Model model, HttpServletRequest request) {
    int pageNum = request.getParameter("pageNum")==null ? 1 : Integer.valueOf( request.getParameter("pageNum"));
    int pageSize = 3;
    PageInfo<Employee> pageInfo = employeeService.queryList(pageNum, pageSize);
    model.addAttribute("pages",pageInfo.getPages());
    model.addAttribute("pageNum",pageInfo.getPageNum());
    model.addAttribute("pageSize",pageInfo.getPageSize());
    model.addAttribute("employees",pageInfo.getList());
    return "list";
}

3.5 HTML

<div>
    <span th:text="'' + ${pages} + ''"></span>
    <span th:text="'当前第' + ${pageNum} + ''"></span>
    <a th:href="@{/emps(pageNum=1)}">首页</a>
    <span th:if="${pageNum}!=1">
        <a th:href="@{/emps(pageNum=${pageNum}-1)}">|上一页</a>
    </span>
    |
    <span th:if="${pageNum} < ${pages}">
        <a th:href="@{/emps(pageNum=${pageNum}+1)}">下一页|</a>
    </span>
    <a th:href="@{/emps(pageNum=${pages})}">尾页</a>
</div>

3.6 测试

1028springbootpage

4. 写在最后

在Spring、Spring Boot 中使用 PageHalper 时导入的依赖不一样!

在Spring、Spring Boot 中配置属性时的方法不一样!

 


❤️ END ❤️
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOEL-T99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值