提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 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: 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;}
}