17、MyBatis 实战 - 之MyBatis使用分页插件PageHelper
一、关于mysql的分页说明
1、mysql当中的分页sql需要使用limit关键字。
2、limit 语法格式:
limit startIndex,pageSize
startIndex :开始下标
pageSize:显示的记录条数
select * from t car limit 0, 3;
mysql当中起始行的下标从0开始。第一条记录的下标是0
3、计算下标
假设每页显示3条记录:
第1页:limit 0,3 (012)
第2页:limit 3,3 (345)
第3页:limit 6,3(678)
第4页:limit 9,3 (910 11)
…
假设每页显示pageSize条记录,第pageNum页,使用limit表示:
limit (pageNum-1)*pageSize,pageSize
4、小细节
select * from t car limit 2; 和 select * from t car limit 0,2;是等效的。
二、MyBatis使用分页插件PageHelper
1、引入分页插件pagehelper的依赖
<!--分页插件pagehelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.1</version>
</dependency>
2、mybatis-cofig.xml配置mybatis分页的拦截器
plugin interceptor="com.github.pagehelper.PageInterceptor"
完整配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"/>
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
<typeAliases>
<package name="com.powernode.mybatis.pojo" />
</typeAliases>
<!--mybatis分页的拦截器-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"> </plugin>
</plugins>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.powernode.mybatis.mapper"/>
</mappers>
</configuration>
3、pojo类Clazz
public class Clazz implements Serializable {
private Integer cid;
private String name;
......此处省略get、set方法
}
4、 ClazzMapper接口;
public interface ClazzMapper {
List<Clazz> selectAll();
}
5、ClazzMapper.xml文件
<?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.powernode.mybatis.mapper.ClazzMapper">
<select id="selectAll" resultType="Clazz">
select * from t_clazz
</select>
</mapper>
6、 测试类趴一下;
记得在查询sql之前,加上这句PageHelper.startPage(pageNum,pageSize);相当于开启PageHelper,否则分页不会生效。
@Test
public void testAll(){
SqlSession sqlSession = SqlSessionUtil.openSqlSession();
ClazzMapper mapper = sqlSession.getMapper(ClazzMapper.class);
int pageNum = 2;
int pageSize = 2;
PageHelper.startPage(pageNum,pageSize);
List<Clazz> clazzes = mapper.selectAll();
clazzes.forEach(e-> System.out.println(e));
sqlSession.close();
}
运行结果
如果需要更加详细的信息,可以使用PageInfo对象来处理:
PageInfo pageInfo = new PageInfo<>(clazzes,4)
@Test
public void testAll(){
SqlSession sqlSession = SqlSessionUtil.openSqlSession();
ClazzMapper mapper = sqlSession.getMapper(ClazzMapper.class);
int pageNum = 2;
int pageSize = 2;
PageHelper.startPage(pageNum,pageSize);
List<Clazz> clazzes = mapper.selectAll();
PageInfo<Clazz> pageInfo = new PageInfo<>(clazzes,4);
System.out.println(pageInfo);
sqlSession.close();
}
运行结果,会有非常详细的分页查询信息
PageInfo{
pageNum=2, pageSize=2, size=2, startRow=3, endRow=4, total=10, pages=5, list=Page{
count=true, pageNum=2, pageSize=2, startRow=2, endRow=4, total=10, pages=5, reasonable=false, pageSizeZero=false}[Clazz{
cid=1003, name='高三三班', stus=null}, Clazz{
cid=1004, name='高三四班', stus=null}], prePage=1, nextPage=3, isFirstPage=false, isLastPage=false, hasPreviousPage=true, hasNextPage=true, navigatePages=4, navigateFirstPage=1, navigateLastPage=4, navigatepageNums=[1, 2, 3, 4]}