分页
为什么要分页?
- 减少数据的处理量
1、使用Limit分页
语法:SELECT * from user limit startIndex,pageSize;
SELECT * from user limit 3; #[0,n]
使用Mybaits实现分页,核心SQL:
1.接口
/**
* 分页查询
*/
public List<User> findByLimit(Map<String,Integer> map);
2.Mapper.xml
<!--分页查询-->
<select id="findByLimit" resultType="user" parameterType="map">
select * from user limit #{startIndex},#{pageSize}
</select>
3.测试
/**
* 分页查询
*/
@Test
public void testLimit(){
SqlSession sqlSession = MybaitsUtils.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("startIndex",1);
map.put("pageSize",3);
List<User> users = mapper.findByLimit(map);
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
2、RowBounds分页
不使用SQL实现分页:
1.接口
/**
* 分页查询2
*/
public List<User> findByRowBounds();
2.mapper.xml
<!--分页查询2-->
<select id="findByRowBounds" resultType="user">
select * from user
</select>
3.测试
/**
* 分页查询2
*/
@Test
public void findByRowBounds(){
SqlSession sqlSession = MybaitsUtils.getSqlSession();
RowBounds rowBounds = new RowBounds(1, 2);
List<User> users = sqlSession.selectList("com.chif.dao.UserDao.findByRowBounds",null,rowBounds);
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
3、分页插件

第一步、引入分页插件-导入依赖
<!--PageHelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
第二步、配置到spring 和mybait 整合的配置文件中
特别注意,新版拦截器是 com.github.pagehelper.PageInterceptor。com.github.pagehelper.PageHelper 现在是一个特殊的 dialect 实现类,是分页插件的默认实现类,提供了和以前相同的用法。
<!--3.创建sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!--配置mybatis 插件-->
<property name="plugins">
<set>
<!--配置pageHelper 分页插件-->
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<props>
<!--方言:-->
<prop key="helperDialect">mysql</prop>
</props>
</property>
</bean>
</set>
</property>
</bean>
第三步、方法调用
使用PageHelper.startPage 静态方法调用startPage :
特点:
- 静态方法,传递两个参数(当前页码,每页查询条数)
- 使用pageHelper 分页的时候,不再关注分页语句,查询全部的语句
- 自动的对PageHelper.startPage 方法下的第一个sql 查询进行分页
PageHelper.startPage(1,5);
//紧跟着的第一个select 方法会被分页
List list = countryMapper.findAll();
也就是说再Service层PageHelper.startPage(1,5);语句后一定是紧跟查询语句。
Service层示例代码
@Override
public PageInfo<Order> pageHelperTest(int currentPage,int pageSize) {
// 分页查询(紧跟在其后的第一条查询sql将会被分页)
PageHelper.startPage(currentPage,pageSize);
List<Order> orders = orderMapper.queryAllOrderDESC();
PageInfo<Order> pageInfo = new PageInfo<Order>(orders);
return pageInfo;
}
返回的信息就是pageInfo对象,该类是插件里的类,这个类里面的属性还是值得看一看
public class PageInfo<T> implements Serializable {
private static final long serialVersionUID = 1L;
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//由于startRow 和endRow 不常用,这里说个具体的用法
//可以在页面中"显示startRow 到endRow 共size 条数据"
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;
//总页数
private int pages;
//结果集
private List<T> list;
//前一页
private int prePage;
//下一页
private int nextPage;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
传智播客——专注于Java、.Net 和Php、网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层电话:400-618-9090
//所有导航页号
private int[] navigatepageNums;
//导航条上的第一页
private int navigateFirstPage;
//导航条上的最后一页
private int navigateLastPage;
}
第四步、前端页面获取Controller层返回的pageInfo数据,使用其属性进行页面展示
vue页面axios方法案例
//分页
page(currentPage){
let _this=this;
_this.loading=true;
_this.axios.get("/order/queryAllByPageHelper?pageSize=11¤tPage="+currentPage).then(res=>{
_this.currentPage=res.data.pageNum;
_this.pageTotal=res.data.pages;
_this.total=res.data.total;
_this.pageSize=res.data.pageSize;
let orders=[];
for (let i = 0; i < res.data.list.length; i++) {
let list=res.data.list[i];
orders[i]={
orid: list.orid,
bus:list.bus,
origin: list.origin,
destination: list.destination,
beginTime: list.beginTime,
endTime: list.endTime,
expectTime: Math.ceil((new Date(list.endTime)-new Date(list.beginTime))/3600000),
client: list.client,
seller: list.seller,
createTime: list.createTime,
cost: list.cost,
costStatus: list.costStatus
};
}
this.Orders=orders;
_this.loading=false;
});
}
本文详细介绍MyBatis中三种分页方式:Limit分页、RowBounds分页及PageHelper插件分页,涵盖具体实现步骤与代码示例,帮助开发者有效管理大量数据。
1085

被折叠的 条评论
为什么被折叠?



