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]]
总结:伪分页模式适用于数据量较小的情况,真分页模式适用于数据量较大的情况