Springboot递归树(需求返回List树状结构数据)

一、本主的应用场景

    部门里面有一个属性是当前部门的上级部门,而当前部门又会有下级部门,下级部门还有下级部门,这就形成了一个向下无限循环,呈现出树状结构。

二、认识JSONObject

    JSONObject只是一种数据结构,可以理解为JSON格式的数据结构(key-value 结构),可以使用put方法给json对象添加元素。JSONObject可以很方便的转换成字符串,也可以很方便的把其他对象转换成JSONObject对象。

postman测试效果图

 

 建表(主键id自增长)


 

 Entity实体类

package com.example.unicom.entity;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;

@Data
public class RoleTree {

    private Integer id;
    private String role_name;
    private Integer parent_role_id;
    private List<RoleTree>trees =new ArrayList<>();
}

        Controller (GeneralResponse为自己添加的公共返回实体类,正式开发加,做练习可以不加)

package com.example.unicom.controller;

import com.example.unicom.entity.RoleTree;
import com.example.unicom.entity.base.GeneralResponse;
import com.example.unicom.service.RoleTreeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
/**
 * @author 孙翊轩
 * @since 2021-09-02
 */
@RestController
@RequestMapping("/isp/unicom/roletree")
public class RoleTreeController {
    @Autowired
    private RoleTreeService roleTreeService;
    @RequestMapping(value ="selectRoleTree",method = RequestMethod.GET)
    public GeneralResponse selectRoleTree(){
        try{
            List<RoleTree> roleTreeList=roleTreeService.selectRoleTree();
            return new GeneralResponse("SUCCESS","查询成功",roleTreeList);
        }catch (Exception e){
            e.printStackTrace();
        }
        return new GeneralResponse("FAIL","查询失败",null);
    }
}

Service接口 

package com.example.unicom.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.unicom.entity.RoleTree;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface RoleTreeMapper extends BaseMapper<RoleTree> {
    List<RoleTree> selectRoleTree();
}

 @Service 业务层

package com.example.unicom.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.unicom.entity.RoleTree;
import com.example.unicom.entity.UserRole;
import com.example.unicom.mapper.RoleTreeMapper;
import com.example.unicom.mapper.UserRoleMapper;
import com.example.unicom.service.RoleTreeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class RoleTreeServiceImpl extends ServiceImpl<RoleTreeMapper,RoleTree>implements RoleTreeService{
    @Autowired
    private RoleTreeMapper roleTreeMapper;
    @Autowired
    private UserRoleMapper userRoleMapper;
    /**
     * 获取所有分类
     * @return
     */
    @Override
    public List<RoleTree> selectRoleTree() {
        List<RoleTree>roleTreeList=roleTreeMapper.selectRoleTree();
        List<UserRole>userRoleList=userRoleMapper.selectAll();
            //定义一个新的List
        List<RoleTree>treeList=new ArrayList<>();
            //找到所有的一级分类
        for(RoleTree roleTree :roleTreeList){
            //一级菜单的parent_role_id是0
            if(roleTree.getParent_role_id()==0){
                treeList.add(roleTree);
            }
        }
            //为1级菜单设置子菜单
        for (RoleTree roleTree :treeList){
            roleTree.setTrees(getchilde(roleTree.getId(),roleTreeList));
        }
        return treeList;
    }
    /**
     * 递归查找子菜单
     * @param id 当前菜单id
     * @param rootList 要查找的列表
     */
    private List<RoleTree>getchilde(Integer id,List<RoleTree>rootList){
            //子菜单的子菜单
        List<RoleTree>childList =new ArrayList<>();
        for (RoleTree roleTree :rootList){
            //遍历所有节点,将父菜单id与传过来的id比较
            if(roleTree.getParent_role_id().equals(id)){
                childList.add(roleTree);
            }
        }
             //将子菜单的子菜单再做循环
        for(RoleTree roleTree :childList){
            roleTree.setTrees(getchilde(roleTree.getId(),rootList));
        }
            //退出递归
        if (childList.size()==0){
            return null;
        }
        return childList;
    }
}

Mapper接口  

package com.example.unicom.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.unicom.entity.RoleTree;

import java.util.List;

public interface RoleTreeService extends IService<RoleTree> {
    List<RoleTree> selectRoleTree();
}

Mapper .xml 映射 

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.unicom.mapper.UserRoleMapper">
    <select id="selectRoleTree" parameterType="com.example.unicom.entity.UserRole" resultType="com.example.unicom.entity.UserRole">
        SELECT user_role.user_id,user_role.user_name,user_role.jg_name
        FROM user_role
    </select>
</mapper>

  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Spring Boot中实现树形结构查询需要以下步骤: 1. 定义树形结构实体类,包含节点ID、父节点ID、节点名称等属性。 2. 使用JPA或MyBatis等持久化框架,将树形结构实体类映射到数据库表中。 3. 编写树形结构查询方法,可以使用递归方式或者使用SQL语句实现。 4. 在Controller层中接收请求,调用树形结构查询方法,返回结果。 下面是一个使用JPA实现树形结构查询的示例代码: ``` @Entity @Table(name = "tree_node") public class TreeNode { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "parent_id") private Long parentId; @Column(name = "name") private String name; // 省略getter和setter方法 } @Service public class TreeService { @Autowired private TreeNodeRepository treeNodeRepository; public List<TreeNode> getTree() { List<TreeNode> rootNodes = treeNodeRepository.findByParentIdIsNull(); for (TreeNode rootNode : rootNodes) { buildTree(rootNode); } return rootNodes; } private void buildTree(TreeNode parentNode) { List<TreeNode> childNodes = treeNodeRepository.findByParentId(parentNode.getId()); if (!childNodes.isEmpty()) { parentNode.setChildren(childNodes); for (TreeNode childNode : childNodes) { buildTree(childNode); } } } } @RestController @RequestMapping("/tree") public class TreeController { @Autowired private TreeService treeService; @GetMapping public List<TreeNode> getTree() { return treeService.getTree(); } } ``` 在上面的示例代码中,TreeNode为树形结构实体类,TreeService中的getTree()方法使用递归方式构建树形结构,TreeController中的getTree()方法返回树形结构数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为人低调的孙翊轩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值