Mybatis实现分页查询

前言:使用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

  • 9
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值