提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 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
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: propertyValue
reasonable: false
defaultCount: 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() {
@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));
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 {
@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();
}
<?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.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;
}
}