Jpa分页工具类 "JpaPageHelper"

----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可以给前端用了。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值