页面上要分页展示层级关系的数据信息,很容易就想到递归,我能想到的主要有两种做法:1 在SQL中使用递归,2 一条简单的SQL将所有要展示的信息获取,使用JAVA代码逻辑进行递归封装。
本文采用的是第二种,主要是考虑到如果数据量过大,使用SQL递归感觉查询较慢,页面等待时间过长(自我感觉,并没有实际验证),但由于是采用的第二种做法,导致无法使用PageHelper三连完成分页(此时SQL返回的是所有记录,并没有递归效果,所以此时做分页毫无意义), 所以需要使用java代码逻辑实现递归完成后在进行简单的分页封装
PageHelper三连:
/**
* pageNo : 第几页
* pageSize : 每页显示多少条
*/
PageHelper.startPage(pageNo, pageSize);
Page<TestVO> pageTestList = testDao.getListById(id);
PageInfo<TestVO> pageInfo = new PageInfo<>(pageTestList);
以下是实现的简单例子,总结方便自己回顾,也希望可以给其他同学提供一点儿思路
要展示的信息的实体类:
class TeacherAndStudent {
private Integer id;
//姓名
private String name;
//上级ID
private Integer superiorId;
//等级 1校长 2主任 3教师 4学生
private Integer level;
private List<TeacherAndStudent> junior;
public TeacherAndStudent(Integer id, String name, Integer superiorId, Integer level)
{
this.id = id;
this.name = name;
this.superiorId = superiorId;
this.level = level;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getSuperiorId() {
return superiorId;
}
public void setSuperiorId(Integer superiorId) {
this.superiorId = superiorId;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
public List<TeacherAndStudent> getJunior() {
return junior;
}
public void setJunior(List<TeacherAndStudent> junior) {
this.junior = junior;
}
@Override
public String toString() {
return "TeacherAndStudent{" +
"id=" + id +
", name='" + name + '\'' +
", superiorId=" + superiorId +
", level=" + level +
", junior=" + junior +
'}';
}
}
分页信息实体类(可以直接从网上扒):
class PageInfo<T> implements Serializable {
private static final long serialVersionUID = 1L;
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//总记录数
private long total;
//总页数
private int pages;
//结果集
private List<T> list;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
public PageInfo() {
}
/**
* 包装Page对象
*
* @param list
*/
public PageInfo(List<T> list) {
if (list instanceof Page) {
Page page = (Page) list;
this.pageNum = page.getPageNum();
this.pageSize = page.getPageSize();
this.pages = page.getPages();
this.list = page;
this.total = page.getTotal();
} else if (list instanceof Collection) {
this.pageNum = 1;
this.pageSize = list.size();
this.pages = 1;
this.list = list;
this.total = list.size();
}
if (list instanceof Collection) {
//判断页面边界
judgePageBoudary();
}
}
/**
* 判定页面边界
*/
private void judgePageBoudary() {
isFirstPage = pageNum == 1;
isLastPage = pageNum == pages;
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
}
public int getPages() {
return pages;
}
public void setPages(int pages) {
this.pages = pages;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
public boolean isIsFirstPage() {
return isFirstPage;
}
public void setIsFirstPage(boolean isFirstPage) {
this.isFirstPage = isFirstPage;
}
public boolean isIsLastPage() {
return isLastPage;
}
public void setIsLastPage(boolean isLastPage) {
this.isLastPage = isLastPage;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("PageInfo{");
sb.append("pageNum=").append(pageNum);
sb.append(", pageSize=").append(pageSize);
sb.append(", total=").append(total);
sb.append(", pages=").append(pages);
sb.append(", list=").append(list);
sb.append(", isFirstPage=").append(isFirstPage);
sb.append(", isLastPage=").append(isLastPage);
sb.append(", navigatepageNums=");
sb.append('}');
return sb.toString();
}
}
递归核心函数:
private static List<TeacherAndStudent> treeList(List<TeacherAndStudent> list, Integer rootId) {
List <TeacherAndStudent> newList = new ArrayList<>();
for (TeacherAndStudent teacherAndStudentTemp : list) {
if(teacherAndStudentTemp.getSuperiorId() == rootId.intValue()) {
List<TeacherAndStudent> tempList = treeList(list, teacherAndStudentTemp.getId());
teacherAndStudentTemp.setJunior(tempList);
newList.add(teacherAndStudentTemp);
}
}
return newList;
}
主函数以及简单的分页参数:
public static void main(String[] args) {
List<TeacherAndStudent> list = new ArrayList<>();
list.add(new TeacherAndStudent(1, "赵校长", 0,1));
list.add(new TeacherAndStudent(2, "赵主任", 1,2));
list.add(new TeacherAndStudent(3, "钱主任", 1,2));
list.add(new TeacherAndStudent(4, "赵老师", 2,3));
list.add(new TeacherAndStudent(5, "钱老师", 2,3));
list.add(new TeacherAndStudent(6, "孙老师", 2,3));
list.add(new TeacherAndStudent(7, "李老师", 2,3));
list.add(new TeacherAndStudent(8, "周老师", 3,3));
list.add(new TeacherAndStudent(9, "吴老师", 3,3));
list.add(new TeacherAndStudent(10, "赵同学", 4,4));
list.add(new TeacherAndStudent(11, "钱同学", 4,4));
list.add(new TeacherAndStudent(12, "孙同学", 4,4));
list.add(new TeacherAndStudent(13, "李同学", 5,4));
list.add(new TeacherAndStudent(14, "周同学", 5,4));
list.add(new TeacherAndStudent(15, "吴同学", 6,4));
List<TeacherAndStudent> newList = treeList(list, 1);
System.out.println(newList);
int pageSize = 10;
int pageNo = 1;
int totalCount = newList.size();
int pages = totalCount / pageSize + (totalCount % pageSize == 0 ? 0 : 1);
int fromIndex = (pageNo - 1 < 0 ? 0 : (pageNo - 1)) * pageSize;
int toIndex = pageSize * pageNo > totalCount ? totalCount : (pageSize * pageNo);
boolean isFirstPage = pageNo == 1;
boolean isLastPage = pageNo == pages;
PageInfo<TeacherAndStudent> pageHelperResult = new PageInfo<>();
pageHelperResult.setList(newList.subList(fromIndex, toIndex));
pageHelperResult.setPageNum(pageNo);
pageHelperResult.setPageSize(pageSize);
pageHelperResult.setTotal(totalCount);
pageHelperResult.setPages(pages);
pageHelperResult.setIsFirstPage(isFirstPage);
pageHelperResult.setIsLastPage(isLastPage);
}
递归查询的结果如下(未分页):
如果大家有更好的思路和方法欢迎评论,我们共同学习,共同进步。
参考资料:
java递归获取某个父节点下面的所有子节点 : https://blog.csdn/tomcat_2014/article/details/51113961
java递归查询公司下所有部门及子部门 : https://blog.csdn/u014079773/article/details/53338116
java中对list进行分页显示数据到页面 : https://blog.csdn/Tang_Mr/article/details/76212184
java.util.List接口的方法subList()进行分页 : https://blog.csdn/lululove19870526/article/details/46742515
ArrayList的subList方法: https://wwwblogs/ljdblog/p/6251387.html
更多推荐
JAVA 递归后台代码实现,并封装简单的分页信息
发布评论