【java】mysql中一个树形表在java代码中如何转换为树形结构(递归)

一、说明:

做项目时,遇到这样一个业务,需要将某个数据库表中的基本数据转化为树形结构返回给前端(基础数据中分为三级:主线、一级、二级),这些数据在存储时分别存储了父级数据的id,并且每一级又分两个主线。
我的做法是按照需求将数据查出,然后在后端利用递归进行树形结构转换。

数据库表结构:

在这里插入图片描述

前端返回数据

public class ProjectLineModel {

    /**
     * 主线id
     */
    @ApiModelProperty(value = "主线id")
    private String lineid;


    /**
     * 主线名称
     */
    @ApiModelProperty(value = "主线名称")
    private String lineName;


    /**
     * 一级项目(主线中嵌套一级项目model)
     */
    @Transient
    private List<ProjectOneModel> listOne;


}

public class ProjectOneModel {

    /**
     * 项目id
     */
    @ApiModelProperty(value = "项目id")
    @Column(name = "id")
    private String projectId;

    /**
     * 项目名称
     */
    @ApiModelProperty(value = "项目名称")
    private String projectName;

    /**
     * 父级id
     */
    @ApiModelProperty(value = "父级id")
    private String parent;


    /**
     * 项目级别
     */
    @ApiModelProperty(value = "项目级别")
    private int level;

    /**
     * 优先级
     */
    @ApiModelProperty(value = "优先级")
    private int priority;

    /**
     * 下一级级项目(一级项目嵌套二级项目、但由于一二级项目的model相同这里就用了一个)
     */
    @Transient
    private List<ProjectOneModel> listNext;

}

二、解决方法

service代码

实现方法:

 public  List<ProjectLineModel>  selectAllProject(int pageNo, int pageSize) {

//      实例化树形结构
  List<ProjectLineModel> lineModelList;

//       查询主线
   List<ProjectLineModel> lineProject = participationDao.selectLineProject(0);
//       查询一二级项目
   List<ProjectOneModel> oneAndTwoProject = participationDao.selectOneAndTwoProject();

//       遍历主线,添加主线model中list的内容(应用java8新特性 流)
   lineModelList=lineProject.stream()
           .map(line -> line.setListOne(setChildProject(line.getLineid(),oneAndTwoProject)))
           .collect(Collectors.toList());
           
  return lineModelList;
 }

递归方法:

 /**
  * 递归方法实现树形结构
  * @param ParentId  父级项目id
  * @param oneAndTwoProject   所有一二级项目
  * @return
  */
 public List<ProjectOneModel> setChildProject(String ParentId, List<ProjectOneModel> oneAndTwoProject) {

//      定义一级项目model
  List<ProjectOneModel> ProjectList1 = new ArrayList<>();

//      为一级项目添加内容
  ProjectList1= oneAndTwoProject.stream()
          .filter(pro -> pro.getParent().equals(ParentId))
          .collect(Collectors.toList());

  if (ProjectList1.size() == 0) {
   return null;
  }
  //      为二级项目添加内容,添加一级项目中list的内容
  ProjectList1.stream()
          .map(child ->child.setListNext(setChildProject(child.getProjectId(), oneAndTwoProject)))
          .collect(Collectors.toList());

  return ProjectList1;

结果:

{
  "code": "0000",
  "message": "查询成功",
  "data": [
    {
      "lineid": "1137190657425674241",
      "lineName": "计算机",
      "listOne": [
        {
          "projectId": "1147028439530016771",
          "projectName": "入门",
          "parent": "1137190657425674241",
          "level": 1,
          "priority": 0,
          "listNext": [
            {
              "projectId": "1151648863681298433",
              "projectName": "开学典礼",
              "parent": "1147028439530016771",
              "level": 2,
              "priority": 0
            },
            {
              "projectId": "1151648863886819329",
              "projectName": "快捷键和搜索引擎使用",
              "parent": "1147028439530016771",
              "level": 2,
              "priority": 1
            },
            {
              "projectId": "1151648864042008578",
              "projectName": "进制的转换、计算机组成原理、三八译码器",
              "parent": "1147028439530016771",
              "level": 2,
              "priority": 3
            },,,,,,,,
           
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MySQL实现树形结构可以使用两种方法: 1. 使用递归查询 递归查询是一种常见的实现树形结构的方法,其基本思路是:先查询出所有的父节点,再递归查询每个父节点下的子节点。 首先,我们需要创建一个表来存储树形结构: ```sql CREATE TABLE tree ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, parent_id INT ); ``` 其,id是节点的唯一标识,name是节点的名称,parent_id是节点的父节点id。 然后,我们可以使用以下SQL语句查询出所有的父节点: ```sql SELECT * FROM tree WHERE parent_id IS NULL; ``` 接着,我们可以使用递归查询的方式查询每个父节点下的子节点: ```sql WITH RECURSIVE cte AS ( SELECT id, name, parent_id, 0 AS level FROM tree WHERE parent_id IS NULL UNION ALL SELECT t.id, t.name, t.parent_id, c.level + 1 FROM tree t JOIN cte c ON t.parent_id = c.id ) SELECT id, name, parent_id, level FROM cte; ``` 这里使用了MySQL的WITH RECURSIVE语法,其cte是一个递归公共表达式,它包含了两个SELECT语句。第一个SELECT语句查询出所有的父节点,第二个SELECT语句递归查询每个父节点下的子节点,并且使用level来记录每个节点的深度。 2. 使用嵌套集模型 嵌套集模型是另一种常见的实现树形结构的方法,其基本思路是:为每个节点添加左右值,通过左右值来表示节点之间的层次关系。 首先,我们需要创建一个表来存储树形结构: ```sql CREATE TABLE tree ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, lft INT NOT NULL, rgt INT NOT NULL ); ``` 其,id是节点的唯一标识,name是节点的名称,lft和rgt是左右值,用来表示节点之间的层次关系。 然后,我们可以使用以下SQL语句查询出整棵树: ```sql SELECT * FROM tree ORDER BY lft; ``` 这里使用了ORDER BY语句来按照左值排序,从而得到整棵树的结构。 接着,我们可以使用以下SQL语句查询每个节点的子节点: ```sql SELECT * FROM tree WHERE lft > :lft AND rgt < :rgt ORDER BY lft; ``` 其,:lft和:rgt是父节点的左右值,用来查询其子节点。这里同样使用了ORDER BY语句来按照左值排序,从而得到每个节点下的子节点。 以上是两种在MySQL实现树形结构的方法,具体选择哪种方法取决于具体的业务需求和数据结构。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值