1. 程式人生 > 其它 >Java 遞迴建樹

Java 遞迴建樹

文章目錄

資料庫欄位

在這裡插入圖片描述
在這裡插入圖片描述

實體類

@Data
public class Tree {

    //主鍵id
    private Integer id;

    //選單名稱
    private String name;

    //父id
    private Integer parentId;

    //孩子集合
    List<Tree> children;
}

Dao層

public interface TreeDao {

    List<Tree> findAll();
}

Mapper層

<?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.vue.dao.TreeDao">

  <resultMap id="BaseResultMap" type="com.example.vue.entity.Tree">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="parent_id" property="parentId"/>
  </resultMap>

  <!--  查詢全部/模糊查詢 -->
  <select id="findAll" resultMap="BaseResultMap">
    select * from t_tree
  </select>

</mapper>

Service層

//遞迴建樹
List<Tree> handleTree();

ServiceImpl層

@Service
public class TreeServiceImpl implements TreeService {

    @Resource
    private TreeDao treeDao;

    @Override
    public List<Tree> handleTree() {

        //從資料庫獲取所有得資料
        List<Tree> allTree = treeDao.findAll();

        //根節點list
        List<Tree> treeList = new ArrayList<>();

        //遍歷從資料庫取到的資料
        if (allTree != null && allTree.size() > 0) {
            for (Tree tree : allTree) {
                //如果父id等於0,把資料迴圈存入根節點
                if (tree.getParentId() == 0) {
                    //存入根節點
                    treeList.add(tree);
                }
            }
        }

        //遍歷根節點中的資料
        if (treeList  != null && treeList .size() > 0) {
            for (Tree tree : treeList) {
                List<Tree> childrenList = getChildren(tree.getId(), allTree);
                //將獲取到的children放入children集合中
                tree.setChildren(childrenList);
            }
        }
        return treeList;
    }

    /**
     * 使用遞迴獲取根節點下面的children集合
     */
    public List<Tree> getChildren(Integer id, List<Tree> allTree) {

        //children集合
        List<Tree> childrenList = new ArrayList<>();

        //迴圈從資料庫查詢到的資料
        for (Tree tree : allTree) {
            //如果父id的內容和傳過來的一級選單id一致
            if (tree.getParentId().equals(id)) {
                //存入根節點
                childrenList.add(tree);
            }
        }

        //迴圈根節點,將根節點中的資料存入實體物件的children中
        if (childrenList != null && childrenList.size() > 0) {
            //迴圈children集合
            for (Tree tree : childrenList) {
                //將獲取到的children放入children集合中
                tree.setChildren(getChildren(tree.getId(), allTree));
            }
        }else {
            return null;
        }

        return childrenList;
    }
}

Controller層

@RestController
@Api(tags = "遞迴建樹")
public class TreeController {

    @Resource(name = "treeServiceImpl")
    private TreeService treeService;

    @GetMapping("tree")
    public Map tree(){

        Map map = new HashMap<>();

        try {
            List<Tree> trees = treeService.handleTree();
            map.put("success", trees);
            map.put("message", true);
        }catch (Exception e){
            e.printStackTrace();
            map.put("err", false);
        }
        return map;
    }

}

測試結果

{
  "success": [
    {
      "id": 1,
      "name": "一級選單",
      "parentId": 0,
      "children": [
        {
          "id": 2,
          "name": "二級選單",
          "parentId": 1,
          "children": [
            {
              "id": 3,
              "name": "三級選單",
              "parentId": 2,
              "children": null
            }
          ]
        }
      ]
    }
  ],
  "message": true
}