PageHelper分页插件的一些坑

分页插件的一些坑:
1)、PageHelper.startPage(pageNum, pageSize)的位置:
PageHelper.startPage(pageNum, pageSize) 只对该语句以后的第一个查询语句得到的数据进行分页!!!

譬如:下面这段代码本来想根据 userName 以及 userCompany 进行条件查询的,但是 startPage() 后面紧跟的不是 userMapper.getUserList(userName, userCompany),因此,分页“并不会生效”,或者说分页用错地方了,用在 userMapper.getById(id) 上了,自然看不到想要的效果。(可自行在控制台查看 sql 的执行效果)

// 设置分页查询条件
PageHelper.startPage(pageNum, pageSize);

// 根据id查询
int user = userMapper.getById(id);

// 根据 userName 和 userCompany 进行条件查询
List<User> userList = userMapper.getUserList(userName, userCompany);

// ...

return xxx;
2)、返回的 PageInfo 对象得到的若干分页属性不正确!!!

这位小哥 跟我遇到的问题一样,但是我俩的解决思路不一样(而且我通过他的方法没成功欸 … )

"total": 10,
"list": [
	{
		"userId": "2510109292",
		"userName": "何老师",
		"userAge": 43
	},
	{
		"userId": "25930291056",
		"userName": "李老师",
		"userAge": 37
	}
],
"pageNum": 2,
"pageSize": 2,
"size": 2,
"startRow": 3,
"endRow": 4,
"pages": 5,
"prePage": 1,
"nextPage": 3,
"isFirstPage": false,
"isLastPage": false,
"hasPreviousPage": true,
"hasNextPage": true,
"navigatePages": 8,
"navigatepageNums": [1,2,3,4,5],
"navigateFirstPage": 1,
"navigateLastPage": 5

这个可能有一定的使用场景:我遇到的情况是这样的:

// 设置分页查询条件
PageHelper.startPage(pageNum, pageSize);

// 根据 userName 和 userCompany 进行条件查询
List<User> userList = userMapper.getUserList(userName, userCompany);

// 但是我并不是要返回下面这样的:
//PageInfo pageInfo2 = new PageInfo<>(userList);
//return pageInfo2;

// 而是需要对 User 对象的某些属性重新进行赋值,并返回其进一步封装之后的对象,例如 UserDto(不是 User)
List<UserDto> userDtoList = new ArrayList<>();
foreach(User user : userList){
	// 对user的属性重新赋值,并构造新的对象 UserDto
	// ....
	user.setXxx();
	
	UserDto userDto = new UserDto(user);
	userDtoList.add(userDto);
}

PageInfo<UserDto> pageInfo = new PageInfo<>(userDtoList);
return pageInfo;
// 这样得到的分页相关属性是不对的,我测试过。详情原因可以看看PageInfo的源码,我还没看...

简言之:
问题就在于我并没有把分页查询的结果(原有的 List)返回,而是返回了一个重新构造的 List

我的解决方法是:
虽然 pageInfo 的分页相关属性不正确,但是前面 List 对应的 pageInfo2 的分页相关属性是正确的,所以可以让最终返回的 pageInfo 的属性也重新进行赋值:

PageInfo<PatientDto> pageInfo = new PageInfo<>(userDtoList);

// 重新对 PageInfo 的分页属性进行赋值
pageInfo.setPageNum(pageInfo2.getPageNum());
pageInfo.setPageSize(pageInfo2.getPageSize());
pageInfo.setTotal(pageInfo2.getTotal());
pageInfo.setSize(pageInfo2.getSize());
pageInfo.setStartRow(pageInfo2.getStartRow());
pageInfo.setEndRow(pageInfo2.getEndRow());
pageInfo.setPages(pageInfo2.getPages());
pageInfo.setPrePage(pageInfo2.getPrePage());
pageInfo.setNextPage(pageInfo2.getNextPage());
pageInfo.setIsFirstPage(pageInfo2.isIsFirstPage());
pageInfo.setIsLastPage(pageInfo2.isIsLastPage());
pageInfo.setHasPreviousPage(pageInfo2.isHasPreviousPage());
pageInfo.setHasNextPage(pageInfo2.isHasNextPage());
pageInfo.setNavigatePages(pageInfo2.getNavigatePages());
pageInfo.setNavigatepageNums(pageInfo2.getNavigatepageNums());
pageInfo.setNavigateFirstPage(pageInfo2.getNavigateFirstPage());
pageInfo.setNavigateLastPage(pageInfo2.getNavigateLastPage());

顺便说一下,跟前端同学沟通过之后,发现他们在实现分页功能的时候,其实只用到了我返回的 pageNum、pageSize、total 这三个参数,其余参数他们是通过前端的分页插件/框架帮忙计算好了… 所以按理说,只需要重新对这三个参数进行重新赋值就好了。
但是由于网页端的分页效果大多如下图所示:

而移动端小程序或者APP通常不使用这种效果:使用上滑–上滑–上滑的样式,滑倒底部之后,自动切换下一页,直到最后一页。所以针对小程序端,他们还会用到 isLastPage(是否是最后一页)这个参数进行判断。为了保险起见,还是保证所有的分页参数都正确吧 !!!

你可能感兴趣的:(java)