java返回樹形結構的正確姿勢
阿新 • • 發佈:2020-09-04
# 業務場景
通常我們前端需要一個樹形的導航選單或者分類選單,如後臺許可權管理中的許可權樹,亦或者下面例子中商城系統的商品分類多級選單(一般為三級選單)
# 資料庫設計
資料庫設計,採用`parentId`來指向自己的父級選單,如:
```mysql
CREATE TABLE `pms_category` (
`cat_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分類id',
`name` char(50) DEFAULT NULL COMMENT '分類名稱',
`parent_cid` bigint(20) DEFAULT NULL COMMENT '父分類id',
`cat_level` int(11) DEFAULT NULL COMMENT '層級',
`show_status` tinyint(4) DEFAULT NULL COMMENT '是否顯示[0-不顯示,1顯示]',
`sort` int(11) DEFAULT NULL COMMENT '排序',
`icon` char(255) DEFAULT NULL COMMENT '圖示地址',
`product_unit` char(50) DEFAULT NULL COMMENT '計量單位',
`product_count` int(11) DEFAULT NULL COMMENT '商品數量',
PRIMARY KEY (`cat_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1433 DEFAULT CHARSET=utf8mb4 COMMENT='商品三級分類';
```
# java組裝樹形結構
之前的做法是通過sql自連線來查出樹形結構資料,但是效率不高,我們知道單表查詢效率是最高的,我們可以一次查出所有資料,通過`java8`的新特性` stream`來處理資料,`stream`是通過`CPU`計算實現,效率極高,具體用法可以參考:
[Java 8新特性之 Lambd和StreamAPI](https://blog.csdn.net/weixin_41793969/article/details/105489106)
下面是處理資料的兩個主要方法:
```java
@Override
public List