JAVA如何把資料庫的資料處理成樹形結構

前言

JAVA如何把資料庫的資料處理成樹形結構

不知道大家在做專案的時候有沒有接觸到將

平平無奇

資料結合處理成

有層次

的資料呢,類似下面這樣

JAVA如何把資料庫的資料處理成樹形結構

或者 生活處處都有,我想大家都應該接觸過的,下面直接看怎麼實現,我會大概講一下思路,當然也可以直接跳到最後去看

程式碼

實現的哈

follow me!go go go!

❗此篇文章也只是一個簡單的學習記錄,不詳細的對程式碼進行講解

實現思路

首先一般資料庫的模型設計如下

JAVA如何把資料庫的資料處理成樹形結構

sql指令碼

—— ———————————————— Table structure for product—— ——————————————DROP TABLE IF EXISTS `product`;CREATE TABLE `product` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `uuid` varchar(64) NOT NULL, `name` varchar(100) NOT NULL COMMENT ‘名稱’, `sort` int(11) DEFAULT NULL COMMENT ‘排序’, `parent_uuid` varchar(64) NOT NULL DEFAULT ‘-1’ COMMENT ‘父親 無父級為-1’, `level` varchar(10) NOT NULL COMMENT ‘產品層級’, `create_time` datetime NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COMMENT=‘產品表’;—— ———————————————— Records of product—— ——————————————INSERT INTO `product` VALUES (‘1’, ‘4dbf40d2-2af7-425c-a103-0349caaa26cf’, ‘生產類’, ‘1’, ‘-1’, ‘1’, ‘2021-09-23 15:34:36’);INSERT INTO `product` VALUES (‘2’, ‘3062deff-8ec7-44c4-bd4e-88fe3c7b835c’, ‘22’, ‘1’, ‘4dbf40d2-2af7-425c-a103-0349caaa26cf’, ‘2’, ‘2021-09-23 15:37:20’);INSERT INTO `product` VALUES (‘3’, ‘32afe426-9337-41c1-83e8-caf3248ba57e’, ‘網際網路資訊’, ‘2’, ‘4dbf40d2-2af7-425c-a103-0349caaa26cf’, ‘2’, ‘2021-09-23 15:38:19’);INSERT INTO `product` VALUES (‘4’, ‘34c5239f-db2d-4394-b367-a57f8ae6f8ff’, ‘33’, ‘1’, ‘3062deff-8ec7-44c4-bd4e-88fe3c7b835c’, ‘3’, ‘2021-09-23 15:53:29’);INSERT INTO `product` VALUES (‘5’, ‘19eedcd3-aa7f-4a2d-8182-d3f795e99b9d’, ‘44’, ‘1’, ‘34c5239f-db2d-4394-b367-a57f8ae6f8ff’, ‘4’, ‘2021-09-23 15:53:56’);

我們觀察一下,可以發現我們的關注重點在name、uuid、parent_uuid上面:

name

:分類名稱

uuid

:UUID 是 通用唯一識別碼(Universally Unique Identifier)的縮寫,是一種軟體建構的標準,其目的,是讓分散式系統中的所有元素,都能有唯一的辨識資訊,而不需要透過中央控制端來做辨識資訊的指定。這裡可以簡單看作一個唯一標識碼(類似於ID但不等於ID)

parent_uuid

:子類的父類UUID,最高階規定為-1(這個可以自己定義,不會有相同的就好)

下面就是我建立的模擬資料

JAVA如何把資料庫的資料處理成樹形結構

想要實現數形狀結構,肯定要以某一屬性來作為突破口,它就是

parent_uuid

,那麼到底是如何實現的 來看具體程式碼

完整程式碼

只貼重點程式碼

首先使用了Mabatis-generator生成了通用後端程式碼,結構如下:

JAVA如何把資料庫的資料處理成樹形結構

ProductController.class

package com。csdn。caicai。test。modules。product。controller;import io。swagger。annotations。Api;import io。swagger。annotations。ApiOperation;import org。slf4j。Logger;import org。slf4j。LoggerFactory;import org。springframework。beans。factory。annotation。Autowired;import org。springframework。validation。annotation。Validated;import org。springframework。web。bind。annotation。*;import com。csdn。caicai。test。modules。product。dto。ProductRsp;import com。csdn。caicai。test。modules。product。biz。IProductBiz;import java。util。List;/** * 產品表 * * @author * @date */@RestController@Api(tags = {“產品表”})@RequestMapping(“/caicai/product”)@Validatedpublic class ProductController { private static final Logger log = LoggerFactory。getLogger(ProductController。class); @Autowired private IProductBiz productBiz; /** * 產品樹 */ @ApiOperation(value = “產品樹”) @RequestMapping(path = “/tree”, method = RequestMethod。GET) public List tree() { return productBiz。tree(); }}

IProductBiz.class

package com。csdn。caicai。test。modules。product。biz;import com。csdn。caicai。test。modules。product。dto。ProductRsp;import java。util。List;/** * @author * @date */public interface IProductBiz { List tree();}

ProductBiz.class

package com。csdn。caicai。test。modules。product。biz;import org。apache。commons。lang3。StringUtils;import org。assertj。core。util。Lists;import org。springframework。beans。factory。annotation。Autowired;import org。springframework。stereotype。Service;import org。springframework。util。CollectionUtils;import java。util。List;import java。util。stream。Collectors;import tk。mybatis。mapper。entity。Example;import com。csdn。caicai。test。modules。product。service。IProductService;import com。csdn。caicai。test。modules。product。dao。entity。ProductEntity;import com。csdn。caicai。test。modules。product。dto。ProductReq;import com。csdn。caicai。test。modules。product。dto。ProductRsp;import static java。util。stream。Collectors。toList;/** * @author * @date */@Service(“productBiz”)public class ProductBiz implements IProductBiz { @Autowired private IProductService productService; /** * 根據條件查詢 * * @param productReq * @return */ public List selectByCondition(ProductReq productReq) { Example example = new Example(ProductEntity。class); //下面新增自定義收索條件 return productService。selectByExample(example); } @Override public List tree() { ProductReq req = new ProductReq(); List list = selectByCondition(req)。stream()。map(this::productConvert)。collect(Collectors。toList()); return buildTree(list, req。getParentUuid()); } private ProductRsp productConvert(ProductEntity e) { ProductRsp orgNode = new ProductRsp(); orgNode。setId(e。getId()); orgNode。setUuid(e。getUuid()); orgNode。setName(e。getName()); orgNode。setLevel(e。getLevel()); orgNode。setSort(e。getSort()); orgNode。setParentUuid(e。getParentUuid()); return orgNode; } public static List buildTree(List all, String parentUuid) { if (CollectionUtils。isEmpty(all)) return Lists。newArrayList(); List parentList = all。stream() 。filter(e -> StringUtils。isBlank(e。getParentUuid()) || “-1”。equals(e。getParentUuid()) || e。getParentUuid()。equals(parentUuid)) 。collect(toList()); getSubList(parentList, all); return parentList; } private static void getSubList(List parentList, List all) { parentList。forEach(e -> { List subList = all。stream()。filter(o -> o。getParentUuid()。equals(e。getUuid()))。collect(toList()); e。setSubList(subList); if (!CollectionUtils。isEmpty(subList)) getSubList(subList, all); }); }}

ProductReq.class

package com。csdn。caicai。test。modules。product。dto;import io。swagger。annotations。ApiModel;import io。swagger。annotations。ApiModelProperty;import lombok。Data;import java。io。Serializable;/*** @author* @date*/@ApiModel(value = “ProductReq”, description = “產品表”)@Datapublic class ProductReq implements Serializable { private static final long serialVersionUID = 1L; /** * */ @ApiModelProperty(value = “”, name = “id”) private Long id; /** * */ @ApiModelProperty(value = “”, name = “uuid”) private String uuid; /** * 名稱 */ @ApiModelProperty(value = “名稱”, name = “name”) private String name; /** * 排序 */ @ApiModelProperty(value = “排序”, name = “sort”) private Integer sort; /** * 父親 無父級為-1 */ @ApiModelProperty(value = “父親 無父級為-1”, name = “parentUuid”) private String parentUuid; /** * 產品層級 */ @ApiModelProperty(value = “產品層級”, name = “level”) private String level;}

ProductRsp.class

package com。csdn。caicai。test。modules。product。dto;import io。swagger。annotations。ApiModel;import io。swagger。annotations。ApiModelProperty;import lombok。Data;import java。io。Serializable;import java。util。Date;import java。util。List;/*** @author* @date*/@ApiModel(value = “ProductRsp”, description = “產品表”)@Datapublic class ProductRsp implements Serializable { private static final long serialVersionUID = 1L; /** * */ @ApiModelProperty(value = “”, name = “id”) private Long id; /** * */ @ApiModelProperty(value = “”, name = “uuid”) private String uuid; /** * 名稱 */ @ApiModelProperty(value = “名稱”, name = “name”) private String name; /** * 排序 */ @ApiModelProperty(value = “排序”, name = “sort”) private Integer sort; /** * 父親 無父級為-1 */ @ApiModelProperty(value = “父親 無父級為-1”, name = “parentUuid”) private String parentUuid; /** * 產品層級 */ @ApiModelProperty(value = “產品層級”, name = “level”) private String level; /** * */ @ApiModelProperty(value = “”, name = “createTime”) private Date createTime; @ApiModelProperty(value = “下屬產品”, name = “subList”) private List subList;}

測試一下

JAVA如何把資料庫的資料處理成樹形結構

可以看到,實現了我們的

效果

總結-核心程式碼

上面羅裡吧嗦,其實

核心程式碼

就是以下程式碼,親們來試著理解一下,然後就可以在此基礎上美化一下就好了: ProductRsp、ProductReq 是實體類,可以自行

替換

裡面的內容

private ProductRsp productConvert(ProductEntity e) { ProductRsp orgNode = new ProductRsp(); orgNode。setId(e。getId()); orgNode。setUuid(e。getUuid()); orgNode。setName(e。getName()); orgNode。setLevel(e。getLevel()); orgNode。setSort(e。getSort()); orgNode。setParentUuid(e。getParentUuid()); return orgNode; } public static List buildTree(List all, String parentUuid) { if (CollectionUtils。isEmpty(all)) return Lists。newArrayList(); List parentList = all。stream() 。filter(e -> StringUtils。isBlank(e。getParentUuid()) || “-1”。equals(e。getParentUuid()) || e。getParentUuid()。equals(parentUuid)) 。collect(toList()); getSubList(parentList, all); return parentList; } private static void getSubList(List parentList, List all) { parentList。forEach(e -> { List subList = all。stream()。filter(o -> o。getParentUuid()。equals(e。getUuid()))。collect(toList()); e。setSubList(subList); if (!CollectionUtils。isEmpty(subList)) getSubList(subList, all); }); }