递归查询菜单树代码详解

如何做一个菜单树?

1.前端处理

这样对后端开发人员来说是非常简单的,select * from xxx ,一句sql 解决问题,而且减少了后端程序处理的时间。

2.后端处理

​ 1)方式一:树节点是有限的,不需要做增加或者删除,或者说就是一个死的树型菜单,而且呢菜单节点不超过3级,后端处理方式可以查出来一级一级封装,这样需要查询数据库最多三次,对于后端人员来说也是比较简单的。

2)方式二:通过递归方式来查询树型菜单,可以动态修改树,这也是比较常用的方式,但是呢,比较复杂,对后端开发人员要求较高。那今天就来用最简单的递归方式来查询一个树型菜单。

//部门类
public class Department{
    private String id;		  								//节点id    必需
    private String parentId;  								//父节点id   必需
    private String name;	 								//节点名称   必需
    private List<Department> children = new ArrayList<>();  //子节点集合 必需
    
   	//当然根据实际业务,这里还可以添加许多属性,例如 节点是否打开,节点对应图标地址,排序等等,今天只做最简单的。
    
    //... 省略get 和 set 方法
}

//业务处理类
public class DepartmentService{
 	
   public List<Department> treeMenu(){
         //1.先查询出所有的菜单集合 这里使用mybatis-plus 
       	 //当然你也可以使用其它方式,总之是这块是要查询出所有的菜单集合
       	 //sql就是 select * from xxx 了
        List<Department> lists = baseMapper.selectList(null);
       	//2.将查询出的菜单集合出入我们要处理的方法,进行第一次处理
        return this.buildTreeMenu(lists);
   }
    
   private  List<Department> buildTreeMenu(List<Department> lists ){
       //菜单树都有一个根节点,就像树肯定有根一样。
       List<Department> tree  =  new ArrayList<>();
       //3.找到根节点
       for(Department d : lists){
           //判断根节点,这里假设根节点具有的特点就是parentId的值为root,当然实际情况要根据需求来设定根节点的特点
           if("root".equals(d.getParentId())){
               //4.将根节点和菜单集合传入要递归封装的方法
               tree.add(this.buildChildren(d,lists));
               break;
           }
       }
       return tree;
   }
   private  Department buildChildren(Department d,List<Department> lists){
       //5.从根节点一层一层进行封装
       for(Department node : lists){
           if(node.getParentId().equals(d.getId()){
               d.getChildren().add(this.buildChildren(node, lists));
           }
       }
       return d;//返回根节点对象
   }
}

ps: 边写边看效果会更好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值