(记录贴)java后台实现树形菜单+分页返回数据
Posted 小样5411
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(记录贴)java后台实现树形菜单+分页返回数据相关的知识,希望对你有一定的参考价值。
问题介绍
这几天做一个功能,也是第一次做树形菜单+分页的功能,觉得挺有意思,记录一下,可以大致看看原型图,要做成什么样子,如下图,要求能分页显示树形菜单。
第一版
Controller层调用一个递归方法getChild(),传参数0进去,数据库中我parent_id设置为0表示最上级,相当于树的根节点,这里传一个0,就可以获取到树的所有结构。
List<RoadPatrolReportConfigVO> reportConfigResults = getChild(0L);//递归获取子节点,0表示顶级父类
public List<RoadPatrolReportConfigVO> getChild(Long pid){
//递归时给子集创建List
List<RoadPatrolReportConfigVO> reportConfigList = new ArrayList<>();
//查出所有等于pid的节点的集合
List<RoadPatrolReportConfigVO> reportConfigNodes = RoadPatrolReportConfigDbTool.getMapper().findParent(pid);
if (reportConfigNodes!=null){
/*遍历当前节点*/
reportConfigNodes.forEach(x->{
/*设置每个节点的子节点(调用自身再次查询子节点,将当前节点的ID作为父节点查询子节点)*/
x.setChildren(getChild(x.getId()));
/*将节点添加到集合中一并返回*/
reportConfigList.add(x);
});
}
return reportConfigList;
}
这里mapper层有个方法,findParent方法
List<RoadPatrolReportConfigVO> findParent(@Param("pid") Long pid);
<select id="findParent" resultType="com.vkl.dao.vo.road.RoadPatrolReportConfigVO">
select * from road_patrol_report_config rprc where parent_id = #{pid}
</select>
这样就可以获取到整个树形结构
然后用分页插件,PageHelper或者其它分页插件,依赖导入一下,就可以将最后得到的List转成Page,这个我是受到下面这篇博客的启发 Java树形菜单实现思路
注意:
但是不知道大家是否有想到这里其实存在一个问题,就是如果顶级父类的数量很多,比如有20个,但是你分页一般传pageNum=1,pageSize=10,这样的话,用上面这个版本,通过0作为顶级父类id,是可以查出来,但是会对所有的数据进行一个遍历,本来只要前10个顶级父类显示,这里却对后面不用显示的10个也进行了一次遍历,这其实可以进行优化一下,先查出pageSize个(假设10个)顶级父类,然后分别对这些父类进行遍历,这样在最开始就进行了分页,不用对所有顶级父类都进行遍历,显示多少就遍历递归多少。
第二版(优化版)
Controller层,主要看思路
{
Page page = new Page(pageNum, pageSize);
//下面queryPageforParent查找出所有顶级父类,即parent_id为0的
RoadPatrolReportConfigDbTool.getMapper().queryPageforParent(page,eventType,problemClasses);//eventType,problemClasses为两个条件,搜索有的
List<RoadPatrolReportConfigVO> voList = page.getRecords();
getChild(voList);//递归形成树结构
page.setRecords(voList);
return ResultMsg.success(page);
}
private List<RoadPatrolReportConfigVO> getChild(List<RoadPatrolReportConfigVO> list){
//分别遍历每个顶级父类
for (RoadPatrolReportConfigVO entry : list) {
Long id = entry.getId();//顶级父类的id
//父id=id,就表示是id的孩子,从而获取到id的所有孩子
List<RoadPatrolReportConfigVO> childs = RoadPatrolReportConfigDbTool.getMapper().selectAllChildren(id);
System.out.println(childs);
//做一个判断,符合有孩子条件就进入继续递归,就像链表一样把路径上所有孩子遍历完再递归setChilds
if (childs != null && childs.size() != 0) {
getChild(childs);
entry.setChildren(childs);
}
}
return list;
}
queryPageforParent和selectAllChildren主要是sql
del_flag表示逻辑删除字段
下面是queryPageforParent
SELECT rc.id,rc.report_code,rc.problem_classes,
rc.problem_desc,
rc.solve_method,
rc.solve_limit,
rc.sort,
rc.parent_id,
rc.emergency_id,
e.event_type
FROM
road_patrol_report_config rc
LEFT JOIN road_event_emergency e ON e.id = rc.emergency_id
where rc.parent_id = 0 and rc.del_flag = '0'
下面是selectAllChildren,这个id就是RoadPatrolReportConfigDbTool.getMapper().selectAllChildren(id);
传过来的id,也就是顶级父类的id
select temp.*,e.event_type
from (select * from road_patrol_report_config) temp
left join road_patrol_report_config rprc on temp.parent_id = rprc.id
left join road_event_emergency e on e.id=temp.emergency_id
where temp.del_flag='0' and temp.parent_id = #{id}
上面就是优化版,不会全部查找,page要多少查多少,避免浪费
以上是关于(记录贴)java后台实现树形菜单+分页返回数据的主要内容,如果未能解决你的问题,请参考以下文章