提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 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)
 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.md
1.3 依赖
1). 使用 Maven
 在 pom.xml 中添加如下依赖:
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>最新版本</version>
</dependency>
2).使用 Spring Boot 时
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><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: propertyValuereasonable: falsedefaultCount: true # 分页插件默认参数支持 default-count 形式,自定义扩展的参数,必须大小写一致
官网可以看参数说明
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在配置文件中的位置必须符合要求,否则会报错,顺序如下:properties?, settings?,typeAliases?, typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?, databaseIdProvider?, mappers?
-->
<plugins><!-- com.github.pagehelper为PageHelper类所在包名 --><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() {@Overridepublic 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() {@Overridepublic void doSelect() {userMapper.selectGroupBy();}
});
//对应的lambda用法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> userMapper.selectGroupBy());//count查询,返回一个查询语句的count数
long total = PageHelper.count(new ISelect() {@Overridepublic void doSelect() {userMapper.selectLike(user);}
});
//lambdatotal=PageHelper.count(()->userMapper.selectLike(user));

 
 
1.6 Page和PageInfo

 
 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 实现原理

1.8 安全调用

 
 
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 {@Autowiredprivate EmpService empService;@RequestMapping("findAll")@ResponseBodypublic List<Emp> findAll(){return empService.findAll();}@RequestMapping("findByPage/{pageNum}/{pageSize}")@ResponseBodypublic 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();}<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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 {@Autowiredprivate EmpMapper empMapper;@Overridepublic List<Emp> findAll() {return empMapper.findAll();}@Overridepublic 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  >>> PageBeanPageInfo<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;}
}
 
 


