作为一个小白的我编写的一个分页工具lucky-paging-lambda分享给大家(期待大佬们意见和建议)

 

lucky-paging-lambda分页工具由三个函数式接口和一个分页工具类组成

1.函数式接口--PageList--

@FunctionalInterface
public interface PageList<T> {
	
	/**
	 * 返回分页前所有需要展示的数据
	 * @return
	 */
	List<T> getPageList();

}

2.函数式接口--PageCount--

@FunctionalInterface
public interface PageCount {
	
	/**
	 * 返回需要展示的所有数据的总记录条数
	 * @return
	 */
	int getCount();

}

3.函数式接口--PageLimit--

@FunctionalInterface
public interface PageLimit<T> {

	/**
	 * 返回当前页的所有数据
	 * @param currPage 当前页的第一条数据在整张表中的位置
	 * @param size 每页所展示的记录条数
	 * @return
	 */
	List<T> limit(int index,int size);

}

4.分页工具类--Paging--

/**
 * 双模式分页工具类
 * @author fk-7075
 * @param <T> 包装类Pojo的类型
 */
public class Paging <T>{
	
	private List<T> list=new ArrayList<>();//伪分页相关
	private int recordnum;//总记录数
	private int pagenum;//总页数
	private int currentpagenum;//当前页码
	private int pagesize;//分页数
	private int index;//当前页的第一条记录的标号
	private PageCount count;//总记录数相关
	private PageLimit<T> limit;//真分页相关
	
	
	public List<T> getList() {
		return list;
	}

	/**
	 * 总记录数
	 * @return
	 */
	public int getRecordnum() {
		return recordnum;
	}

	/**
	 * 总页面数
	 * @return
	 */
	public int getPagenum() {
		return pagenum;
	}

	/**
	 * 当前页的页码
	 * @return
	 */
	public int getCurrentpagenum() {
		return currentpagenum;
	}

	/**
	 * 分页数
	 * @return
	 */
	public int getPagesize() {
		return pagesize;
	}

	/**
	 * 当前页第一条数据在整张表中的位置
	 * @return
	 */
	public int getIndex() {
		return index;
	}
	
	/**
	 * 初始化分页处理器,使用Lambda表达式确定总记录数和当前页(真分页)
	 * @param count 获取记录条数的方法
	 * @param limit 获取当前页数据的方法
	 */
	public Paging(PageCount count,PageLimit<T> limit) {
		this.count=count;
		this.limit=limit;
	}
	
	/**
	 * 初始化分页处理器,使用Lambda表达式确定策略方法(伪分页)
	 * @param pagelist 得到分页前所有数据的方法
	 */
	public Paging(PageList<T> pagelist) {
		list=pagelist.getPageList();
		recordnum=list.size();
	}
	
	/**
	 * 伪分页方式获取当前页的所有数据
	 * @param currentpagenum 当前页码
	 * @param pagesize 分页数
	 * @return
	 */
	public  List<T> getPageList(int currentpagenum,int pagesize){
		List<T> page=new ArrayList<>();
		init(recordnum,currentpagenum,pagesize);
		list.stream().skip(index).limit(pagesize).forEach(page::add);
		return page;
	}
	
	/**
	 * 真分页方式获取当前页的所有数据
	 * @param currentpagenum 当前页的页码
	 * @param pagesize 分页数
	 * @return
	 */
	public List<T> getLimitList(int currentpagenum,int pagesize){
		recordnum=count.getCount();
		init(recordnum,currentpagenum,pagesize);
		return limit.limit(index,this.pagesize);
	}
	
	
	/**
	 * 使用总记录数、当前页码、分页数初始化本页的所有分页参数
	 * @param recordnum 总记录数
	 * @param currentpagenum 当前页码
	 * @param pagesize 分页数
	 */
	private void init(int recordnum,int currentpagenum,int pagesize) {
		this.pagesize=pagesize;
		if(recordnum%pagesize==0) {
			pagenum=recordnum/pagesize;
		}else {
			pagenum=recordnum/pagesize+1;
		}
		if(currentpagenum>=pagenum) {
			this.currentpagenum=pagenum;
		}else if(currentpagenum<=1) {
			this.currentpagenum=1;
		}else {
			this.currentpagenum=currentpagenum;
		}
		index=(this.currentpagenum-1)*this.pagesize;
	}

}

Paging中提供个两套构造器与方法的组合,分别对应伪分页模式和真分页模式

我们讨论一下lucky-paging在SSM框架场景中的使用

1.准备user表

2.编写UserMapper接口

public interface UserMapper {
	
	//得到所有的用户信息(列表展示)
	List<User> getAll();
	
	//得到数据的记录条数
	int getPageNum();
	
	//执行分页的语句
	List<User> getPageList(@Param("index")int index,@Param("size")int size);
	

}

3.编写UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.fk.day01.mapper.UserMapper">
    	<select id="getAll" resultType="User">
    		SELECT uid,uname,password,photo FROM user
    	</select>
    	<select id="getPageNum" resultType="int">
    		SELECT COUNT(*) FROM user
    	</select>
    	
    	<select id="getPageList" resultType="User">
    		SELECT * FROM user LIMIT #{index},#{size}
    	</select>
    </mapper>

一.伪分页(构造器public Paging(PageList<T> pagelist)+执行方法public  List<T> getPageList(int currentpagenum,int pagesize))

	@RequestMapping("/page")
	public void testpage() {
		Paging<User> paging=new Paging<>(userMapper::getAll);
		System.err.println(paging.getPageList(2, 3));
	}

 执行结果:

[User [uid=36, uname=Sricr, password=12344, photo=test_fk/upload/43b3f9df0068492ab9f5a9a98fa32649_Chrysanthemum.jpg], User [uid=38, uname=Cokie, password=58324, photo=/test_fk/upload/631fa38acc044108a706aa562c5db662_Desert.jpg], User [uid=39, uname=43, password=gt, photo=null]]

 

二.真分页(构造器public Paging(PageCount count,PageLimit<T> limit)+执行方法public List<T> getLimitList(int currentpagenum,int pagesize))

	@RequestMapping("/page")
	public void testpage() {
		Paging<User> paging=new Paging<>(userMapper::getPageNum, (x,y)->userMapper.getPageList(x, y));
		System.out.println(paging.getLimitList(1, 3));
	}

执行结果:

[User [uid=1, uname=jack, password=1234, photo=test_fk/upload/0d3acf81dad1477da9ecb4f472b070c0_Tulips.jpg], User [uid=4, uname=lucy, password=0721, photo=test_fk/upload/1561625656071.jpg], User [uid=17, uname=Tom, password=tomcat, photo=test_fk/upload/1561625695514.jpg]]

总结:伪分页模式适用于数据量较小的情况,真分页模式适用于数据量较大的情况

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lucky:)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值