首先在实体类创建一个对象
/* * 保存子分类用的 * */ @TableField(exist=false)//声明不是数据库里面的,用来存父级数据的子数据 private List<CategoryEntity> children;
查询出所有的菜单,配合mybatisplus查询mysql数据库的.selectList方法,参数没有写“null”
@Override public List listWithTree() { //1.查出所有分类 List entities = baseMapper.selectList(null); //2.组装成父子的树形结构 //2.1找到所有一级分类 List level1Menus = entities.stream().filter(categoryEntity ->categoryEntity.getParentCid() == 0 ).map((menu)->{menu.setChildren(getChikdrens(menu,entities));return menu;}) //映射到子级 .sorted((menu1,menu2)->{return menu1.getSort()-menu2.getSort();}).//排序 collect(Collectors.toList());//收集起来返回 return level1Menus; }
开始递归查询
//递归查询所有菜单的子菜单 private List getChikdrens(CategoryEntity root, List all) { List children = all.stream().filter(categoryEntity -> { return categoryEntity.getParentCid() == root.getCatId();//筛选所有数据,当前得父级id=root.getcatid 就说明当前菜单就是他的子菜单 }).map(categoryEntity -> { categoryEntity.setChildren(getChikdrens(categoryEntity,all));//拿到筛选出来的子菜单,和全部得菜单两个参数 return categoryEntity;//收集出来得子菜单中可能还有子菜单,所以还要map一个个拿出来继续操作 }).sorted((menu1,menu2)->{return (menu1.getSort()==null?0:menu1.getSort())-(menu2.getSort()==null?0:menu2.getSort());}).//进行排序(可能为0的话 就会出现空指针) collect(Collectors.toList()); return children; }
表结构如下图
查出来的结果