赞
踩
失败,是正因你在距成功一步之遥的时候停住了脚步。
limit index,pageSize
pageSize:每页显示的条数
pageNum:当前页的页码
index:当前页的起始索引,index=(pageNum-1)*pageSize
count:总记录数
totalPage:总页数
totalPage = count / pageSize;
if(count % pageSize != 0){
totalPage += 1;
}
pageSize=4,pageNum=1,index=0 limit 0,4
pageSize=4,pageNum=3,index=8 limit 8,4
pageSize=4,pageNum=6,index=20 limit 8,4
首页 上一页 2 3 4 5 6 下一页 末页
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
MyBatis 配置 xml 中配置拦截器插件
特别注意,新版拦截器是 com.github.pagehelper.PageInterceptor。
com.github.pagehelper.PageHelper 现在是一个特殊的 dialect 实现类,是分页插件的默认实现类,提供了和以前相同的用法。
<!--
plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?
-->
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
</plugin>
</plugins>
mapper.xml中的查询语句不用写LIMIT,分页插件会自动添加,只需要写正常查询就可以
例:select * from 表。即可
使用PageHelper
DynamicSQLMapper接口
// 查询全部员工
List<Emp> getEmp();
DynamicSQLMapper.xml
不要再sql语句结尾加;,加了会报错。
(org.apache.ibatis.exceptions.PersistenceException:)
(select emp_id, emp_name, age, gender, dept_id from t_emp; LIMIT ?)
<!--List<Emp> getEmp();-->
<select id="getEmp" resultType="emp">
select emp_id, emp_name, age, gender, dept_id
from t_emp
</select>
测试
@Test
public void testLimit() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
//查询功能之前开启分页功能,告诉分页插件要显示第几页,每页显示多少条数据,返回值是Page对象,包含所有分页信息
Page<Object> page = PageHelper.startPage(1, 4);
List<Emp> list = mapper.getEmp();
sqlSession.close();
list.forEach(System.out::println);
}
new PageInfo<>
@Test
public void testLimit() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
// 1.在查询功能之前开启分页
PageHelper.startPage(1, 4);
// 查询功能
List<Emp> list = mapper.getEmp();
// 2.在查询功能之后获取分页相关信息
PageInfo<Emp> page = new PageInfo<>(list,5);
list.forEach(System.out::println);
}
在接口中传入分页数据
mapper接口对应的方法中添加pageNum,pageSize属性
List<Emp> getEmp(@Param("pageNum") int pageNum, @Param("pageSize") int pageSize);
在mybatis配置文件或者spring配置文件中添加属性
name=“supportMethodsArguments” value=“true”
例:mybatis配置文件
<!--分页插件-->
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
<property name="param1" value="value1"/>
<!--自动分页-->
<property name="supportMethodsArguments" value="true"/>
</plugin>
</plugins>
直接使用就可以,不需要在mapper方法执行前使用 PageHelper.startPage(1, 4);
在查询功能之前使用PageHelper.startPage(int pageNum, int pageSize)开启分页功能
在查询获取list集合之后,使用PageInfo pageInfo = new PageInfo<>(List list, intnavigatePages)获取分页相关数据
PageInfo{
pageNum=8, pageSize=4, size=2, startRow=29, endRow=30, total=30, pages=8,
list=Page{count=true, pageNum=8, pageSize=4, startRow=28, endRow=32, total=30,
pages=8, reasonable=false, pageSizeZero=false},
prePage=7, nextPage=0, isFirstPage=false, isLastPage=true, hasPreviousPage=true,
hasNextPage=false, navigatePages=5, navigateFirstPage4, navigateLastPage8,
navigatepageNums=[4, 5, 6, 7, 8]
}
pageNum:当前页的页码
pageSize:每页显示的条数
size:当前页显示的真实条数
total:总记录数
pages:总页数
prePage:上一页的页码
nextPage:下一页的页码
isFirstPage/isLastPage:是否为第一页/最后一页
hasPreviousPage/hasNextPage:是否存在上一页/下一页
navigatePages:导航分页的页码数
navigatepageNums:导航分页的页码,[1,2,3,4,5]
SQL语法
# 语法
SELECT * from user limit startIndex,pageSize
SELECT * from user limit 3 #[0,n]
使用Mybatis实现分页,核心SQL
// 查询全部员工
List<Emp> getEmpLimit(@Param("startIndex") int startIndex, @Param("pageSize") int pageSize);
<!--分页-->
<!--List<Emp> getEmpLimit(@Param("startIndex") int startIndex, @Param("pageSize") int pageSize);-->
<select id="getEmpLimit" resultType="emp">
select emp_id, emp_name, age, gender, dept_id
from t_emp
limit #{startIndex},#{pageSize};
</select>
@Test
public void testGetEmpLimit() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
List<Emp> list = mapper.getEmpLimit(0, 4);
sqlSession.close();
list.forEach(System.out::println);
}
不再使用SQL实现分页,使用java来实现分页
// 查询全部员工
List<Emp> getEmpByRowBounds();
<!--List<Emp> getEmpByRowBounds();-->
<select id="getEmpByRowBounds" resultType="emp">
select emp_id, emp_name, age, gender, dept_id
from t_emp
</select>
@Test
public void testgetEmpByRowBounds() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
// 实现RowBounds
RowBounds rowBounds = new RowBounds(0, 4);
// 通过java代码层面实现分页
List<Emp> list = sqlSession.selectList("pers.tianyu.mapper.DynamicSQLMapper.getEmpByRowBounds", null, rowBounds);
sqlSession.close();
list.forEach(System.out::println);
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。