----2018.11.21 更新了一个小版本,返回结果改为了Map集合,前后端结合更灵活
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 逻辑分页工具类
* @Description 逻辑分页插件,调用静态方法SetStartPage传入需要分页的List集合即可
* @version 1.1
* @author XinYutian
*
*/
public class PageHelper {
public static Map<String,Object> SetStartPage(List<?> list,int pageNow,int Size){
boolean isFristPage=false;
boolean isLastPage=false;
boolean haveNexPage=false;
boolean havePerPage=false;
int pageSize=0;
int totalRow=list.size();
int fromIndex=(pageNow-1)*Size;
int toIndex=pageNow*Size;
if(fromIndex==0) {
isFristPage=true;
}else if (!isFristPage) {
havePerPage=true;
}
if(toIndex>=totalRow) {
toIndex=totalRow;
isLastPage=true;
}else if (!isLastPage) {
haveNexPage=true;
}
if(totalRow%Size==0) {
pageSize=totalRow/Size;
}else {
pageSize=totalRow/Size+1;
}
Map<String,Object> map=new HashMap<>();
map.put("pageIndex", pageNow);
map.put("totalPage", pageSize);
map.put("totalCount", totalRow);
map.put("pageSize", Size);
map.put("fristPage", isFristPage);
map.put("lastPage", isLastPage);
map.put("haveNexPage", haveNexPage);
map.put("havePerPage", havePerPage);
map.put("list", list.subList(fromIndex, toIndex));
return map;
}
}
最近在做一个基于SpringBoot的项目,持久层实现使用的是Jpa,开始用户需求中没有要求实现分页,但最近提出了分页需求,怎么办呢?如果按照以往的方法,直接在SQL语句里写明limit的话,需要改动的地方未免太多,从Dao到Service再到Controller都需要重新编写。于是去网上搜索Jpa分页实现,发现它本身提供了一个Pageable接口可以实现原生的分页,但也需要修改大量的代码并且只会返回分页后的数据。之前用过Mybatis的PageHelper插件感觉甚是方便,只需要传几个简单的参数就可以获得有用且方便后续编程的数据,例如有无上下页之类的。因为本身拿到的数据量并不会很大,大约在百量级,所以决定在最后的拿到的数据上做文章。既然返回的数据是List,那么只需要对这个数据进行切割就能实现“分页”效果了,并且不取决所用的数据库,只是对结果进行了切割封装(是逻辑分页而不是物理分页),查阅Java API发现有list.subList(fromIndex, toIndex)这个方法,so,开始做一个JpaPageHelper工具类。
import java.util.ArrayList;
import java.util.List;
/**
* 分页插件
*
* @author XinYutian
*
*/
public class JpaPageHelper {
public List<PageInfo> SetStartPage(List<?> list,int pageNow,int Size){
boolean isFristPage=false;
boolean isLastPage=false;
boolean haveNexPage=false;
boolean havePerPage=false;
int pageSize=0;
int fromIndex=(pageNow-1)*Size;
int toIndex=pageNow*Size;
if(fromIndex==0) {
isFristPage=true;
}else if (!isFristPage) {
havePerPage=true;
}
if(toIndex>=list.size()) {
toIndex=list.size();
isLastPage=true;
}else if (!isLastPage) {
haveNexPage=true;
}
if(list.size()%Size==0) {
pageSize=list.size()/Size;
}else {
pageSize=list.size()/Size+1;
}
List<PageInfo> pageInfos=new ArrayList<>();
PageInfo pageInfo=new PageInfo();
pageInfo.setPageNow(pageNow);
pageInfo.setTotlePage(pageSize);
pageInfo.setPgaeSize(Size);
pageInfo.setFristPage(isFristPage);
pageInfo.setLastPage(isLastPage);
pageInfo.setHaveNexPage(haveNexPage);
pageInfo.setHavePerPage(havePerPage);
pageInfo.setList(list.subList(fromIndex, toIndex));
pageInfos.add(pageInfo);
return pageInfos;
}
}
很简单的操作,判断了是否为首尾页,有无上下页,并把数据封装为list方便前端处理。下面是PageInfo类:
import java.util.List;
public class PageInfo {
private int TotlePage;
private int PgaeSize;
private int PageNow;
private boolean isFristPage;
private boolean isLastPage;
private boolean havePerPage;
private boolean haveNexPage;
private List<?> list;
public PageInfo() {
// TODO 自动生成的构造函数存根
}
public int getTotlePage() {
return TotlePage;
}
public void setTotlePage(int totlePage) {
TotlePage = totlePage;
}
public int getPgaeSize() {
return PgaeSize;
}
public void setPgaeSize(int pgaeSize) {
PgaeSize = pgaeSize;
}
public int getPageNow() {
return PageNow;
}
public void setPageNow(int pageNow) {
PageNow = pageNow;
}
public boolean isFristPage() {
return isFristPage;
}
public void setFristPage(boolean isFristPage) {
this.isFristPage = isFristPage;
}
public boolean isLastPage() {
return isLastPage;
}
public void setLastPage(boolean isLastPage) {
this.isLastPage = isLastPage;
}
public boolean isHavePerPage() {
return havePerPage;
}
public void setHavePerPage(boolean havePerPage) {
this.havePerPage = havePerPage;
}
public boolean isHaveNexPage() {
return haveNexPage;
}
public void setHaveNexPage(boolean haveNexPage) {
this.haveNexPage = haveNexPage;
}
public List<?> getList() {
return list;
}
public void setList(List<?> list) {
this.list = list;
}
}
工具类完成了,测试一下效果:
浏览器输出:
可以看出这不是首页也不是尾页,是第2页,共有3页,每页5条数据,有上下页,ok可以给前端用了。