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


浙公网安备 33010602011771号