前言:使用mybatis整合时,最容易遇到的需求就是分页了,pagehelper 分页插件是一个非常实用的 MyBatis分页插件,可以快速的实现MyBatis分页功能,而且pagehelper有个优点就是分页和Mapper.xml完全解耦,并以插件的形式实现,有效的避免了直接写分页SQL语句来实现分页功能
分页插件原理:分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,添加对应的物理分页语句和物理分页参数
举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10
项目实例
1.新建项目修改pom以及application.properties
首先新创建一个空项目,怎么创建这里就不说了,然后修改pom文件,引入pagehelper以及mybatis相关依赖如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
<!--缺少此jar包,导致@Mapper注解无效-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
修改application.properties,配置数据源以及pagehelper相关插件如下:
spring.datasource.url=jdbc:mysql://localhost:3306/movie?useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#设置数据库类型
pagehelper.helperDialect = mysql
#传入页数大于总页数,则会将传入页数修改为总页数
pagehelper.reasonable = true
#支持通过mapper接口参数传递page参数,也就是说当supportMethodsArguments设置为 true 时候默认启用了分页,并且先执行了count后面的查询也拼接了limit
pagehelper.supportMethodsArguments = true
#增加了该参数来配置参数映射,用于从对象中根据属性名取值
pagehelper.params=count=countSql
2.创建实体类
这里我使用了上述数据库表里的字段创建实体类
package com.example.paging.entity;
import org.apache.ibatis.javassist.SerialVersionUID;
import java.io.Serializable;
/**
* @Author: 王鑫垚
* @Description:
* @Date: Create in 15:40 2020/2/23
*/
public class Movie implements Serializable {
private static final long SerialVersionUID = 1L;
private int id;
private String directors;
private String title;
private String cover;
private float rate;
private String casts;
//省略getter,setter以及constructor
3.Dao层
首先在dao层添加一个分页查询接口方法,这里我也是直接用了注解的SQL查询方式进行数据获取,这是一个查找全部记录的查询语句,并不需要写分页SQL,因为分页插件会拦截查询请求,并读取前台传来的分页查询参数重新生成分页查询语句
@Mapper
public interface MovieMapper {
@Select("select * from movie")
List<Movie> pageAll();
}
4.service层
服务层通过调用DAO层方法实现分页查询,这里将会统一封装分页查询的请求和结果类,从而避免因为替换ORM框架而导致服务层、控制层的分页接口也需要变动的情况,起到了解耦的作用
MovieService
public interface MovieService {
PageResult findPage(PageRequest pageRequest);
}
MovieServiceImpl
@Service
public class MovieServiceImpl implements MovieService {
@Autowired
private MovieMapper movieMapper;
@Override
public PageResult findPage(PageRequest pageRequest) {
return PageUtils.getPageResult(pageRequest,getPageInfo(pageRequest));
}
/*调用分页插件完成分页*/
private PageInfo<Movie> getPageInfo(PageRequest pageRequest) {
int pageNum = pageRequest.getPageNum();
int pageSize = pageRequest.getPageSize();
PageHelper.startPage(pageNum, pageSize);
List<Movie> sysMenus = movieMapper.pageAll();
return new PageInfo<Movie>(sysMenus);
}
}
5.controller层
controller层中添加分页查询方法,请求服务层的分页查询方法
@RestController
public class MovieController {
@Autowired
private MovieServiceImpl movieService;
@PostMapping("/pageAll")
public Object findPage(@RequestBody PageRequest pageQuery){
return movieService.findPage(pageQuery);
}
}
6.分页查询请求封装类
public class PageRequest {
/*当前页码*/
private int pageNum;
/*每页数量*/
private int pageSize;
//省略getter,setter方法
}
7.分页查询结果封装类
public class PageResult {
/*当前页码*/
private int pageNum;
/*每页数量*/
private int pageSize;
/*记录总数*/
private long totalSize;
/*页码总数*/
private int totalPages;
/*数据内容*/
private List<?> content;
//省略getter,setter方法
}
8.分页查询工具类
public class PageUtils {
/*将分页信息封装到统一的接口*/
public static PageResult getPageResult(PageRequest pageRequest, PageInfo<?> pageInfo) {
PageResult pageResult = new PageResult();
pageResult.setPageNum(pageInfo.getPageNum());
pageResult.setPageSize(pageInfo.getPageSize());
pageResult.setTotalSize(pageInfo.getTotal());
pageResult.setTotalPages(pageInfo.getPages());
pageResult.setContent(pageInfo.getList());
return pageResult;
}
}
9.分页接口测试
我这里直接postman进行测试如下:
结语:对于mybatis实现分页查询就简单介绍到这,项目Demo以传到github,地址如下:https://github.com/Thinkao/mybatis-pagehelper,如有疑问欢迎留言,common progress