博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA返回树结构(宇宙第一详细教程)
阅读量:3961 次
发布时间:2019-05-24

本文共 5175 字,大约阅读时间需要 17 分钟。

表结构

SQL结构和数据

DROP TABLE IF EXISTS `demo`;CREATE TABLE `demo` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `pid` int(11) NOT NULL,  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;INSERT INTO `demo` VALUES ('1', '0', 'A');INSERT INTO `demo` VALUES ('2', '1', 'B');INSERT INTO `demo` VALUES ('3', '1', 'C');INSERT INTO `demo` VALUES ('4', '2', 'D');INSERT INTO `demo` VALUES ('5', '2', 'E');INSERT INTO `demo` VALUES ('6', '3', 'F');INSERT INTO `demo` VALUES ('7', '3', 'G');

Pom文件

           
org.springframework.boot
           
spring-boot-starter-web
       
        
           
com.alibaba
           
druid
           
1.1.1
       
       
           
mysql
           
mysql-connector-java
           
5.1.39
       
        
           
org.mybatis.spring.boot
           
mybatis-spring-boot-starter
           
1.2.0
       

application.properties文件

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/treespring.datasource.username=rootspring.datasource.password=1234spring.datasource.driver-class-name=com.mysql.jdbc.Driver

TreeMapper

@Mapperpublic interface TreeMapper {     @Select("select * from demo")    List
getAll(); }

对应数据库的Tree实体类

public class Tree {        private Integer id;    private Integer pid;    private String name;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public Integer getPid() {        return pid;    }    public void setPid(Integer pid) {        this.pid = pid;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public String toString() {        return "Tree{" +                "id=" + id +                ", pid=" + pid +                ", name='" + name + '\'' +                '}';    }}

NewTree,定义返回给前段的树类型,根据业务不同自行修改(这里为了简单起见,只修改了id和pid的类型)

public class NewTree {    private String id;    private String pid;    private String name;    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getPid() {        return pid;    }    public void setPid(String pid) {        this.pid = pid;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public String toString() {        return "Tree{" +                "id=" + id +                ", pid=" + pid +                ", name='" + name + '\'' +                '}';    }}

MenuTreeUtil,递归构造树形结构

@Componentpublic class MenuTreeUtil {        //已经被buildTree的list集合    private List
menuCommon; //返回给前端的NewTree List集合 private List
list = new ArrayList(); public List menuList(List
menu){ this.menuCommon = menu; // 通过遍历menu,找到父节点为0的节点,它是顶级父节点 // 然后调用menuChild,递归遍历所有子节点 for (NewTree x : menu) { Map
mapArr = new LinkedHashMap
(); if("0".equals(x.getPid())){ mapArr.put("id", x.getId()); mapArr.put("name", x.getName()); mapArr.put("pid", x.getPid()); //遍历开始 mapArr.put("childList", menuChild(x.getId())); list.add(mapArr); } } return list; } private List
menuChild(String id){ List
lists = new ArrayList(); //继续遍历menu for(NewTree a:menuCommon){ Map
childArray = new LinkedHashMap
(); //找到父ID等于父节点ID的子节点 if(a.getPid().equals(id)){ childArray.put("id", a.getId()); childArray.put("name", a.getName()); childArray.put("pid", a.getPid()); //向下递归 childArray.put("childList", menuChild(a.getId())); lists.add(childArray); } } return lists; }}

TreeController

@Controllerpublic class TreeController {    @Resource    TreeMapper treeMapper;    @Resource    MenuTreeUtil menuTreeUtil;        @RequestMapping(value = "/menuList",method = {RequestMethod.GET})    @ResponseBody    public String getTree() throws Exception {            List
list = buildTree(treeMapper.getAll()); List
menuList = menuTreeUtil.menuList(list); System.out.println(menuList); return "YES"; } //将实体类,变成标准的树结构,即NewTree类型 private List
buildTree(List
list){ List
newTrees = new LinkedList<>(); for(Tree tree:list){ NewTree newTree = new NewTree(); newTree.setId(String.valueOf(tree.getId())); newTree.setPid(String.valueOf(tree.getPid())); newTree.setName(tree.getName()); newTrees.add(newTree); } return newTrees; }}

启动项目,并在地址栏输入如下地址即可

结果展示(JSON在线解析)

[{	id = 1,	name = A,	pid = 0,	childList = [{		id = 2,		name = B,		pid = 1,		childList = [{			id = 4,			name = D,			pid = 2,			childList = []		}, {			id = 5,			name = E,			pid = 2,			childList = []		}]	}, {		id = 3,		name = C,		pid = 1,		childList = [{			id = 6,			name = F,			pid = 3,			childList = []		}, {			id = 7,			name = G,			pid = 3,			childList = []		}]	}]}]

参考 

转载地址:http://bqazi.baihongyu.com/

你可能感兴趣的文章
Ubuntu Server 设置sshd
查看>>
sort,uniq命令的使用。
查看>>
linux下md5加密(使用openssl库C实现)
查看>>
openssl、MD5的linux安装方法
查看>>
DevC++ 工程没有调试信息的解决办法
查看>>
http消息长度的确定
查看>>
手机和电脑如何连接蓝牙
查看>>
HTTP协议参数
查看>>
wireshark检索命令
查看>>
五人分鱼问题(附答案)
查看>>
linux查看文件有多少行
查看>>
error:previous declartion of "XXX" is here的解决方法
查看>>
sha1的几个函数的使用
查看>>
为什么int型的数组用memset不能清零(memset的使用规范)
查看>>
<转>CRC校验、MD5、SHA1算法的概念和可靠性现状
查看>>
linux杀死进程详解
查看>>
字符串表示的IP地址与点分式表示的IP地址间的相互转化
查看>>
implicit declaration of function 这种警告问题的原因及解决方法
查看>>
utorrent如何处理占资源过大的问题
查看>>
<好文分享>妖怪和和尚过河问题
查看>>