Spring Boot整合pagehelper

之前讲了Springboot整合Mybatis,然后介绍了如何自动生成pojo实体类、mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能。本章来说一说Mybatis 的分页功能:使用PageHelper插件,实现分页功能。

一、PageHelper介绍

pageHelper是一款非常简单、易用的分页插件,它能很好的集成在spring boot中。它是一个基于mybatis的一款插件,所以我们在使用它时,我们需要使用mybatis作为持久层框架。

github地址是https://github.com/pagehelper/pagehelper-spring-boot

1.1.PageHelper插件

在正常的查询业务之中,只需要加上一行代码就可以实现分页的数据的封装处理

1.2.实现原理

PageHelper方法使用了静态的ThreadLocal参数,分页参数和线程是绑定的。内部流程是ThreadLocal中设置了分页参数(pageIndex,pageSize),之后在查询执行的时候,获取当线程中的分页参数,执行查询的时候通过拦截器在sql语句中添加分页参数,之后实现分页查询,查询结束后在 finally 语句中清除ThreadLocal中的查询参数

1.3.使用方法

  • 调用PageHelper方法:PageHelper.startPage(pageNum, pageSize)
  • MyBatis 查询方法

注意:只要你可以保证在PageHelper方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为PageHelper在finally代码段中自动清除了ThreadLocal存储的对象。

二、案例演示

案例要求,查询mydb数据中emp表中数据,实现分页查询

2.1.创建一个spring boot项目或者模块,这里以之前模块为基础,进行演示

注意:下图中在哪使用官方地址创建的时候报错了,就改用阿里云地址了:https://start.aliyun.com/

设置模块信息

选择创建springweb模块

二、依赖设置

在pom.xml中添加如下依赖设置

<!--mybatis依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

        <!--MySQL数据库连接的依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>

        <!--lombok插件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
            <scope>provided</scope>
        </dependency>

        <!-- pagehelper分页依赖 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.12</version>
        </dependency>

三、在resource目录中设置配置文件

在resource下创建application.yml,内容如下

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.augus.pojo

四、在resource下创建包mapper存放映射文件

在下面创建EmpMapper.xml内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.augus.mapper.EmpMapper">
    <!--查询所有的员工信息-->
    <select id="queryAllEmp" resultType="emp">
        select * from emp
    </select>
</mapper>

五、在com.augus中创建如下内容

5.1.创建pojo,存在实体类

在下面创建Emp表的实体类,内容如下:

package com.augus.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Date;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Emp implements Serializable {
    private Integer empno;
    private String ename;
    private String job;
    private Integer mgr;
    private Date hiredate;
    private Double sal;
    private String comm;
    private Integer deptno;
}

5.2.创建mapper包

在里面创建EmpMapper接口

package com.augus.mapper;

import com.augus.pojo.Emp;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface EmpMapper {
    List<Emp> queryAllEmp();
}

5.3.创建service包

在下面创建接口 EmpService,内容如下

package com.augus.service;

import com.augus.pojo.Emp;
import com.github.pagehelper.PageInfo;

import java.util.List;

public interface EmpService {
    List<Emp> findAll();

    PageInfo findByPage(Integer pageNum, Integer pageSize);
}

在service下创建impl包,存放实体类,在里面新建EmpServiceImpl类,内容如下

package com.augus.service.impl;

import com.augus.mapper.EmpMapper;
import com.augus.pojo.Emp;
import com.augus.service.EmpService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;

    @Override
    public List<Emp> findAll() {
        return empMapper.queryAllEmp();
    }

    @Override
    public PageInfo findByPage(Integer pageNum, Integer pageSize) {
        // 设置分页 页数和 页面最大数量,会自动达到分页的效果
        Page<Emp> page = PageHelper.startPage(pageNum, pageSize);
        //查询出来所有内容,会根据上面设置的分页参数显示
        List<Emp> emps = empMapper.queryAllEmp();

        //给前端页面返回分页信息,在前端进行显示
        PageInfo<Emp> empPageInfo = new PageInfo<>(emps);

        System.out.println("当前页"+empPageInfo.getPageNum());
        System.out.println("总页数"+empPageInfo.getPages());
        System.out.println("页大小"+empPageInfo.getSize());
        System.out.println("总记录数"+empPageInfo.getTotal());
        System.out.println("当前页数据"+empPageInfo.getList());

        return empPageInfo;
    }
}

5.4.创建包controller

在下面创建类EmpController

package com.augus.controller;

import com.augus.pojo.Emp;
import com.augus.service.EmpService;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
@RequestMapping("/emp")
public class EmpController {
    @Autowired
    private EmpService empService;

    @RequestMapping("/findAll")
    @ResponseBody
    public List<Emp> findAll(){
        return empService.findAll();
    }

    //实现分页查询
    @RequestMapping("/findByPage/{pageNum}/{pageSize}")
    @ResponseBody
    public PageInfo findAll(@PathVariable("pageNum") Integer pageNum, @PathVariable("pageSize") Integer pageSize){
        return empService.findByPage(pageNum, pageSize);
    }
}

六、在项目中集成logback日志

为了方便代码调试,这里添加logback日志,只需要在resource目录下添加logback.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="${catalina.base}/logs/" />
    <!-- 控制台输出 -->
    <appender name="Stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 日志输出格式 -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
            </pattern>
        </layout>
    </appender>
    <!-- 按照每天生成日志文件 -->
    <appender name="RollingFile"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/server.%d{yyyy-MM-dd}.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
            </pattern>
        </layout>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
    <!-- 日志输出级别 -->
    <root level="debug">
        <appender-ref ref="Stdout" />
        <appender-ref ref="RollingFile" />
    </root>
    <logger name="com.augus.mapper" level="DEBUG"></logger>
    <!--日志异步到数据库 -->
    <!--<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
            日志异步到数据库
            <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
               连接池
               <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
                  <driverClass>com.mysql.jdbc.Driver</driverClass>
                  <url>jdbc:mysql://127.0.0.1:3306/databaseName</url>
                  <user>root</user>
                  <password>root</password>
                </dataSource>
            </connectionSource>
      </appender> -->
</configuration>

七、测试

启动项目,在浏览器访问http://localhost:8080/emp/findByPage/2/5

posted @ 2022-11-09 12:42  酒剑仙*  阅读(857)  评论(0)    收藏  举报