springboot 递归无限级分类(生成树样式)

小编没写过无限级的分类,刚好有个小项目是需要写无限级的。

这种递归最好用于5级以下的分类。也可以做成无限级的,但是这样对服务器不是很友好。

由于小编的数据表的分类有一千多条信息,就不提供数据表的信息了,小编就跟大家说一下数据表结构,认住三个数据就行了,其他都不重要

数据表结构: id(分类id)、name(分类名称)、parentld(父分类id,顶级分类是0)

Category(实体类)

@Data
@Table(name = "数据表名称")
public class Category {

    @Id
    @KeySql(useGeneratedKeys=true)
    private Long id;  //分类id
    private String name;  //分类名称
    private Long parentId;  //父分类id,顶级分类是0
    private Boolean isParent;  
    private Integer sort;
    private Date createTime;
    private Date updateTime;
    private List<Category> treeList =new ArrayList<>();

}

CategoryMapper(dao层)

public interface CategoryMapper extends BaseMapper<Category> {
    //由于是用mybatis-plus的语法,所以不需要写查询语句
}

CategoryService(Service层)

.selectAll()是mybatis-plus的语法,如果需要您是用ssm的可以在dao层写MySQL(获取表的所有数据)

@Service
public class CategoryService {

    @Autowired
    private CategoryMapper categoryMapper;

    /**
     * 获取所有分类
     * @return
     */
    public List<Category> queryCatList(){
        // 用boot获取分类的数据   selectAll在springboot中是获取数据表里的所有数据
        List<Category> data = categoryMapper.selectAll();
        //定义新的list
        List<Category> categoriesList = new ArrayList<>();
        //先找到所有的一级分类
        for(Category category : data){
            // 一级菜单的parentId是0
            if(category.getParentId() == 0){
                categoriesList.add(category);
            }
        }
        // 为一级菜单设置子菜单,getChild是递归调用的
        for(Category category : categoriesList){
            category.setTreeList(getChilde(category.getId(), data));
        }
        return categoriesList;
    }

    /**
     * 递归查找子菜单
     *
     * @param id 当前菜单id
     * @param rootList 要查找的列表
     * @return
     */
    private List<Category> getChilde(Long id, List<Category> rootList){
        //子菜单
        List<Category> childList = new ArrayList<>();
        for(Category category : rootList){
            // 遍历所有节点,将父菜单id与传过来的id比较
            if(category.getParentId().equals(id)){
                childList.add(category);
            }
        }
        // 把子菜单的子菜单再循环一遍
        for(Category category : childList){
            category.setTreeList(getChilde(category.getId(), rootList));
        }
        // 递归退出条件
        if (childList.size() == 0){
            return null;
        }
        return childList;
    }

}

CategoryController(web层)

@RestController
@RequestMapping("category")
@CrossOrigin  //简单跨域问题
public class CategoryController {

    @Autowired
    private CategoryService categoryService;

    /**
     * 查询所有数据
     */
    @GetMapping("findList")
    public List<Category> queryCatList(){
        List<Category> list = categoryService.queryCatList();
        return list;
    }

}

效果图

希望这篇文章对您有帮助!

本站资源除特别声明外,转载文章请声明文章出处
东泰博客 » springboot 递归无限级分类(生成树样式)

4 评论

  1. selectAll不是springboot的方法,而是mybatis-plus的

    1. 好的,我现在修改,非常感谢您的意见。

  2. 怎么加你啊 博主 qq没有用

    1. 微信:s643425631

发表评论