MyBatis--08--分页插件PageHelper

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 1.分页插件PageHelper
    • 1.1 mysql中 limit 关键字含义
    • 1.2 PageHelper 官网
        • https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md](https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md)![在这里插入图片描述
    • 1.3 依赖
    • 1.4 配置拦截器插件
      • 1.4.1 在 Spring Boot 中配置
      • 1.4.2 Spring 配置文件中配置拦截器插件
      • 1.4.3 在 MyBatis 配置 xml 中配置拦截器插件
    • 1.5 如何在代码中使用
    • 1.6 Page和PageInfo
    • 1.7 实现原理
    • 1.8 安全调用
  • 2.PageHelper案例
    • 2.1 Controller
    • 2.2 EmpMapper
    • 2.3 EmpService


1.分页插件PageHelper

1.1 mysql中 limit 关键字含义

limit (startIndex, pageSize) 参数含义( 起始页面值, 每页显示记录数

  • pageSize; 页面大小
  • pageCurrent: 当前页
  • startIndex: 起始页面值=(页码-1)*每页显示记录数

int startIndex=(pageCurrent-1)pageSize;

Limit 单个数字 默认 从第一页 0 开始 查询

SELECT * FROM emp LIMIT 3;     默认 limit 0 ,3

MyBatis--08--分页插件PageHelper_第1张图片
limit startIndex, pageSize

SELECT * FROM emp LIMIT 0,2;    第一页数据
SELECT * FROM emp LIMIT 2,2;    第二页数据
SELECT * FROM emp LIMIT 4,2;    第三页数据

1.2 PageHelper 官网

https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.mdMyBatis--08--分页插件PageHelper_第2张图片

1.3 依赖

1). 使用 Maven
在 pom.xml 中添加如下依赖:

<dependency>
    <groupId>com.github.pagehelpergroupId>
    <artifactId>pagehelperartifactId>
    <version>最新版本version>
dependency>

2).使用 Spring Boot 时

<dependency>
    <groupId>com.github.pagehelpergroupId>
    <artifactId>pagehelper-spring-boot-starterartifactId>
    <version>最新版本version>
dependency>

1.4 配置拦截器插件

1.4.1 在 Spring Boot 中配置

Spring Boot 引入 starter 后自动生效,对分页插件进行配置时,

  • properties:
pagehelper.propertyName=propertyValue
pagehelper.reasonable=false
pagehelper.defaultCount=true
  • yaml:
pagehelper:
  propertyName: propertyValue
  reasonable: false
  defaultCount: true # 分页插件默认参数支持 default-count 形式,自定义扩展的参数,必须大小写一致

官网可以看参数说明
MyBatis--08--分页插件PageHelper_第3张图片
MyBatis--08--分页插件PageHelper_第4张图片

1.4.2 Spring 配置文件中配置拦截器插件

使用 spring 的 XML 配置方式,可以使用 plugins 属性像下面这样配置:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  
  <property name="plugins">
    <array>
      <bean class="com.github.pagehelper.PageInterceptor">
          <property name="properties">
              
              <value>
                  params=value1
              value>
          property>
      bean>
    array>
  property>
bean>

1.4.3 在 MyBatis 配置 xml 中配置拦截器插件


<plugins>
    
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        
        <property name="param1" value="value1"/>
    plugin>
plugins>

1.5 如何在代码中使用

分页插件支持以下几种调用方式:

//第一种,RowBounds方式的调用
List<User> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));

//第二种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10);
List<User> list = userMapper.selectIf(1);

//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(1, 10);
List<User> list = userMapper.selectIf(1);

//第四种,参数方法调用
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
    List<User> selectByPageNumSize(
            @Param("user") User user,
            @Param("pageNum") int pageNum,
            @Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代码中直接调用:
List<User> list = userMapper.selectByPageNumSize(user, 1, 10);

//第五种,参数对象
//如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
//有如下 User 对象
public class User {
    //其他fields
    //下面两个参数名和 params 配置的名字一致
    private Integer pageNum;
    private Integer pageSize;
}
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
    List<User> selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
List<User> list = userMapper.selectByPageNumSize(user);

//第六种,ISelect 接口方式
//jdk6,7用法,创建接口
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
    @Override
    public void doSelect() {
        userMapper.selectGroupBy();
    }
});
//jdk8 lambda用法
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(()-> userMapper.selectGroupBy());

//也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
    @Override
    public void doSelect() {
        userMapper.selectGroupBy();
    }
});
//对应的lambda用法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> userMapper.selectGroupBy());

//count查询,返回一个查询语句的count数
long total = PageHelper.count(new ISelect() {
    @Override
    public void doSelect() {
        userMapper.selectLike(user);
    }
});
//lambda
        total=PageHelper.count(()->userMapper.selectLike(user));

MyBatis--08--分页插件PageHelper_第5张图片
MyBatis--08--分页插件PageHelper_第6张图片
MyBatis--08--分页插件PageHelper_第7张图片

1.6 Page和PageInfo

MyBatis--08--分页插件PageHelper_第8张图片
MyBatis--08--分页插件PageHelper_第9张图片
Page对象 参数解析

private int pageNum;	//当前页码
private int pageSize; 	//每页数据的数量
private int startRow;	//始页首行行号
private int endRow;		//尾页尾行行号
private long total;		//总记录数
private int pages;		//总页数
private Boolean reasonable; //分页合理化
private Boolean pageSizeZero; //当设置为true的时候,如果pagesize设置为0(或RowBounds的limit=0),就不执行分页,返回全部结果

PageInfo对象

    private int pageNum;   			//当前页
    private int pageSize;			//每页显示数据条数
    private int size;				//当前页的数量
    private int startRow; 			//始页首行行号
    private int endRow;				//尾页尾行行号
    private long total;				//总记录数
    private int pages;				//总页数
    private List<T> list;			//查询结果的数据
    private int firstPage;			//首页
    private int prePage;			//上一页
    private int nextPage;			// 下一页
    private int lastPage;			//最后一页
    private boolean isFirstPage;	//是不是第一页
    private boolean isLastPage;		//是不是最后一页
    private boolean hasPreviousPage;//有没有上一页
    private boolean hasNextPage;	//有没有下一页
    private int navigatePages;		//所有导航页号
    private int[] navigatepageNums;	//导航页码数

1.7 实现原理

MyBatis--08--分页插件PageHelper_第10张图片

1.8 安全调用

MyBatis--08--分页插件PageHelper_第11张图片
MyBatis--08--分页插件PageHelper_第12张图片
MyBatis--08--分页插件PageHelper_第13张图片

2.PageHelper案例

2.1 Controller

package com.msb.controller;

import com.msb.pojo.Emp;
import com.msb.service.EmpService;
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;

/**
 * @Author: Ma HaiYang
 * @Description: MircoMessage:Mark_7001
 */
@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 List<Emp> findByPage(@PathVariable("pageNum") Integer pageNum,@PathVariable("pageSize") Integer pageSize){
        return empService.findByPage(pageNum,pageSize);
    }


}

2.2 EmpMapper

package com.msb.mapper;

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

import java.util.List;

/**
 * @Author: Ma HaiYang
 * @Description: MircoMessage:Mark_7001
 */
@Mapper
public interface EmpMapper {

    List<Emp> findAll();

}


DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.msb.mapper.EmpMapper">

    <select id="findAll" resultType="emp">
        select * from emp
    select>

mapper>

2.3 EmpService

package com.msb.service;

import com.msb.pojo.Emp;

import java.util.List;

/**
 * @Author: Ma HaiYang
 * @Description: MircoMessage:Mark_7001
 */
public interface EmpService {
    List<Emp> findAll();

    List<Emp> findByPage(Integer pageNum, Integer pageSize);
}

package com.msb.service.impl;

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

import java.util.List;

/**
 * @Author: Ma HaiYang
 * @Description: MircoMessage:Mark_7001
 */
@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
    @Override
    public List<Emp> findAll() {
        return empMapper.findAll();
    }

    @Override
    public List<Emp> findByPage(Integer pageNum, Integer pageSize) {
        Page<Emp> page = PageHelper.startPage(pageNum, pageSize);
        List<Emp> list = empMapper.findAll();
        // 页码  页大小  当前页数据  总页数  总记录数

        // 方式1
        /*System.out.println("当前页:"+page.getPageNum());
        System.out.println("总页数"+page.getPages());
        System.out.println("页大小:"+page.getPageSize());
        System.out.println("总记录数:"+page.getTotal());
        System.out.println("当前页数据"+page.getResult());*/


        // 方式2 PageInfo  >>> PageBean
        PageInfo<Emp> pi =new PageInfo<>(list);
        System.out.println("当前页"+pi.getPageNum());
        System.out.println("总页数"+pi.getPages());
        System.out.println("页大小"+pi.getSize());
        System.out.println("总记录数"+pi.getTotal());
        System.out.println("当前页数据"+pi.getList());


        return list;
    }
}

MyBatis--08--分页插件PageHelper_第14张图片
MyBatis--08--分页插件PageHelper_第15张图片
MyBatis--08--分页插件PageHelper_第16张图片

你可能感兴趣的:(Spring基础知识--SSM,mybatis,android)