面經整理-猿輔導-內容服務后端-java實習

部門管理系統設計

題目要求

  1. 設計部門 MySQL 數據表
  2. 實現接口:根據中間部門 ID 獲取其下屬葉子部門 ID
  3. 設計包含子節點列表的 Java 數據對象,并實現批量獲取功能

一、MySQL 部門表設計

表結構

CREATE TABLE department (id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '部門ID',name VARCHAR(100) NOT NULL COMMENT '部門名稱',parent_id BIGINT COMMENT '父部門ID,頂級部門為NULL',is_leaf TINYINT(1) DEFAULT 0 COMMENT '是否為葉子部門:0-否,1-是',FOREIGN KEY (parent_id) REFERENCES department(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部門表';

字段說明

  • id: 主鍵,部門唯一標識
  • name: 部門名稱
  • parent_id: 父部門關聯ID
  • is_leaf: 葉子節點標識(可選)

優化建議

可選擇動態計算葉子節點:

SELECT COUNT(*) FROM department WHERE parent_id = ? 

二、獲取葉子部門接口實現

簡單的獲取當前節點下的葉子節點:

SELECT d.id, d.name, d.is_leaf
FROM department d
WHERE d.parent_id = 2;  -- 技術部的 id 是 2

遞歸查詢方案,查詢當前節點及其子節點下所有的葉子節點(MySQL 8.0+)

WITH RECURSIVE dept_tree AS (-- 基礎查詢:選出指定的幾個部門(比如傳入的中間部門 ids)SELECT id, parent_id, is_leafFROM departmentWHERE id IN (1)  -- 🔹輸入的部門ID,可以是中間部門或任意部門UNION ALL-- 遞歸查詢:找出這些部門的子部門,再子部門的子部門...(無限層級往下遍歷)SELECT d.id, d.parent_id, d.is_leafFROM department dJOIN dept_tree dt ON d.parent_id = dt.id
)
-- 最終查詢:從遞歸結果中,篩選出 is_leaf = 1 的部門,即葉子節點
SELECT id
FROM dept_tree
WHERE is_leaf = 1;

三、Java 數據對象設計與批量獲取功能實現

1. Java 數據對象設計(包含子節點列表)

我們設計一個 Department 類,用于表示部門信息,并包含其子部門列表,以支持樹形結構的構建。

import java.util.ArrayList;
import java.util.List;/*** 部門實體類,包含子節點列表,用于構建部門樹結構*/
public class Department {private Long id;private String name;private Long parentId;private Boolean isLeaf;private List<Department> children; // 子部門列表// 構造函數// Getter 和 Setter 方法public List<Department> getChildren() {return children;}public void setChildren(List<Department> children) {this.children = children;}// 添加子節點public void addChild(Department child) {this.children.add(child);}
}

2. 批量獲取葉子部門 ID 的功能實現

我們提供一個服務類 DepartmentService,其中包含如下功能:

? 根據中間部門 ID 獲取其下屬所有葉子部門 ID

? 批量獲取多個中間部門的葉子部門 ID

? 構建部門樹(可選,用于前端展示等場景)

2.1 Service 接口定義
import java.util.List;public interface DepartmentService {/*** 根據中間部門ID,獲取其下屬所有葉子部門的ID列表* @param parentId 中間部門ID* @return 葉子部門ID集合*/List<Long> getLeafDepartmentIds(Long parentId);/*** 批量獲取多個中間部門ID下屬的所有葉子部門ID* @param parentIds 中間部門ID集合* @return Map<中間部門ID, 葉子部門ID列表>*/Map<Long, List<Long>> getLeafDepartmentIdsBatch(List<Long> parentIds);/*** 獲取所有部門數據(用于構建樹或遞歸查詢,可從數據庫加載)* @return 部門列表*/List<Department> getAllDepartments();/*** 構建部門樹結構(可選功能,用于展示等)* @param departments 所有部門列表* @return 樹形結構的部門列表(通常只有根節點或一級節點)*/List<Department> buildDepartmentTree(List<Department> departments);
}
2.2 Service 實現類
import org.springframework.stereotype.Service;import java.util.*;
import java.util.stream.Collectors;@Service
public class DepartmentServiceImpl implements DepartmentService {// 模擬從數據庫中獲取所有部門信息(實際應從數據庫查詢,比如使用JPA、MyBatis等)@Overridepublic List<Department> getAllDepartments() {// 這里模擬數據,實際應從數據庫查詢List<Department> departments = new ArrayList<>();departments.add(new Department(1L, "總公司", null, false));departments.add(new Department(2L, "技術部", 1L, false));departments.add(new Department(3L, "產品部", 1L, false));departments.add(new Department(4L, "前端組", 2L, true));departments.add(new Department(5L, "后端組", 2L, true));departments.add(new Department(6L, "UI組", 3L, true));departments.add(new Department(7L, "測試組", 2L, true));return departments;}/*** 獲取指定父部門下所有葉子部門的ID*/@Overridepublic List<Long> getLeafDepartmentIds(Long parentId) {List<Department> allDepts = getAllDepartments();return findLeafIds(allDepts, parentId);}/*** 批量獲取多個父部門下的所有葉子部門ID*/@Overridepublic Map<Long, List<Long>> getLeafDepartmentIdsBatch(List<Long> parentIds) {List<Department> allDepts = getAllDepartments();Map<Long, List<Long>> result = new HashMap<>();for (Long parentId : parentIds) {List<Long> leafIds = findLeafIds(allDepts, parentId);result.put(parentId, leafIds);}return result;}/*** 遞歸查找某個父部門下所有的葉子部門ID*/private List<Long> findLeafIds(List<Department> departments, Long parentId) {List<Long> leafIds = new ArrayList<>();// 找出直接子部門for (Department dept : departments) {if (Objects.equals(dept.getParentId(), parentId)) {if (dept.getIsLeaf() != null && dept.getIsLeaf()) {// 是葉子節點leafIds.add(dept.getId());} else {// 非葉子節點,遞歸查找leafIds.addAll(findLeafIds(departments, dept.getId()));}}}return leafIds;}/*** 構建部門樹結構(可選,用于前端樹形展示)*/@Overridepublic List<Department> buildDepartmentTree(List<Department> departments) {// 找出所有根節點(parent_id is null)List<Department> roots = departments.stream().filter(d -> d.getParentId() == null).collect(Collectors.toList());// 遞歸構建子節點for (Department root : roots) {buildChildren(root, departments);}return roots;}/*** 遞歸設置子節點*/private void buildChildren(Department parent, List<Department> allDepartments) {List<Department> children = allDepartments.stream().filter(d -> Objects.equals(d.getParentId(), parent.getId())).collect(Collectors.toList());for (Department child : children) {parent.addChild(child);buildChildren(child, allDepartments); // 遞歸查找子節點的子節點}}
}
3. 接口調用示例(Controller 示例,可選)

如果你使用 Spring Boot,可以提供一個 REST 接口來調用上述服務:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;
import java.util.Map;@RestController
@RequestMapping("/api/departments")
public class DepartmentController {@Autowiredprivate DepartmentService departmentService;/*** 獲取某個部門下的所有葉子部門ID*/@GetMapping("/leaf-ids/{parentId}")public List<Long> getLeafIds(@PathVariable Long parentId) {return departmentService.getLeafDepartmentIds(parentId);}/*** 批量獲取多個部門下的所有葉子部門ID*/@PostMapping("/leaf-ids/batch")public Map<Long, List<Long>> getLeafIdsBatch(@RequestBody List<Long> parentIds) {return departmentService.getLeafDepartmentIdsBatch(parentIds);}/*** 獲取完整的部門樹結構(可選)*/@GetMapping("/tree")public List<Department> getDepartmentTree() {List<Department> allDepts = departmentService.getAllDepartments();return departmentService.buildDepartmentTree(allDepts);}
}

四、總結

功能 實現內容

MySQL 表設計 包含 id、name、parent_id、is_leaf 字段,支持層級與葉子標識

遞歸查詢葉子部門 SQL(MySQL 8.0+) 使用 WITH RECURSIVE 查詢指定部門下所有葉子節點

Java 實體類 Department 類,包含子節點列表 children,支持樹形結構

批量獲取葉子部門ID Service 層提供根據父部門 ID(或批量)查詢所有葉子部門 ID 的功能,支持遞歸查找

可選功能 構建完整的部門樹結構,便于前端展示;提供 REST 接口調用

五、擴展建議

  1. 緩存優化:對于部門數據不頻繁變動的場景,可使用 Redis 緩存部門樹或葉子部門關系,提高查詢效率。
  2. 數據庫索引優化:為 parent_id 字段添加索引,加快查詢速度。
  3. 動態 is_leaf:如果不想手動維護 is_leaf 字段,可通過查詢是否有子部門來動態判斷是否為葉子節點。
  4. 異步加載:對于大型部門樹,可考慮懶加載/異步加載子節點,提升用戶體驗。

如你還需要 MyBatis 或 JPA 的具體實現、前端樹形組件對接、遞歸性能優化等,可以繼續提問!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93824.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93824.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93824.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Openharmony之window_manager子系統源碼、需求定制詳解

1. 模塊概述 Window Manager 模塊是 OpenHarmony 操作系統的核心窗口管理系統,負責窗口的創建、銷毀、布局、焦點管理、動畫效果以及與硬件顯示的交互。該模塊采用客戶端-服務端架構,提供完整的窗口生命周期管理和用戶界面交互支持。 1.1架構總覽 Window Manager Client 應…

《CDN加速的安全隱患與解決辦法:如何構建更安全的網絡加速體系》

CDN&#xff08;內容分發網絡&#xff09;作為提升網站訪問速度的關鍵技術&#xff0c;被廣泛應用于各類互聯網服務中。然而&#xff0c;在享受加速優勢的同時&#xff0c;CDN也面臨諸多安全隱患。本文將解析常見的CDN安全問題&#xff0c;并提供實用的解決辦法&#xff0c;幫助…

【Linux指南】GCC/G++編譯器:庖丁解牛——從源碼到可執行文件的奇幻之旅

不只是簡單的 gcc hello.c 每一位Linux C/C++開發者敲下的第一行編譯命令,幾乎都是 gcc hello.c -o hello 或 g++ hello.cpp -o hello。這像一句神奇的咒語,將人類可讀的源代碼變成了機器可執行的二進制文件。但在這條簡單的命令背后,隱藏著一個如同精密鐘表般復雜的多步流…

地區電影市場分析:用Python爬蟲抓取貓眼_燈塔專業版各地區票房

在當今高度數據驅動的影視行業&#xff0c;精準把握地區票房表現是制片方、宣發團隊和影院經理做出關鍵決策的基礎。一部電影在北上廣深的表現與二三線城市有何差異&#xff1f;哪種類型的電影在特定區域更受歡迎&#xff1f;回答這些問題&#xff0c;不能再依賴“拍腦袋”和經…

Spark03-RDD02-常用的Action算子

一、常用的Action算子 1-1、countByKey算子 作用&#xff1a;統計key出現的次數&#xff0c;一般適用于K-V型的RDD。 【注意】&#xff1a; 1、collect()是RDD的算子&#xff0c;此時的Action算子&#xff0c;沒有生成新的RDD&#xff0c;所以&#xff0c;沒有collect()&…

[Android] 顯示的內容被導航欄這擋住

上圖中彈出的對話框的按鈕“Cancel/Save”被導航欄遮擋了部分顯示&#xff0c;影響了使用。Root cause: Android 應用的主題是 Theme.AppCompat.Light1. 修改 AndroidManifest.xml 將 application 標簽的 android:theme 屬性指向新的自定義主題&#xff1a;<applicationandr…

分貝單位全指南:從 dB 到 dBm、dBc

引言在射頻、音頻和通信工程中&#xff0c;我們經常會在示波器、頻譜儀或測試報告里看到各種各樣的dB單位&#xff0c;比如 dBm、dBc、dBV、dBFS 等。它們看起來都帶個 dB&#xff0c;實則各有不同的定義和參考基準&#xff1a;有的表示相對功率&#xff0c;有的表示電壓電平&a…

怎么確定mysql 鏈接成功了呢?

asyncio.run(test_connection()) ? Connection failed: cryptography package is required for sha256_password or caching_sha2_password auth methods 根據你提供的錯誤信息,問題出現在 MySQL 的認證插件和加密連接配置上。以下是幾種解決方法: 1. 安裝 cryptography 包…

(5)軟件包管理器 yum | Vim 編輯器 | Vim 文本批量化操作 | 配置 Vim

Ⅰ . Linux 軟件包管理器 yum01 安裝軟件在 Linux 下安裝軟件并不像 Windows 下那么方便&#xff0c;最通常的方式是去下載程序的源代碼并進行編譯&#xff0c;從而得到可執行程序。正是因為太麻煩&#xff0c;所以有些人就把一些常用的軟件提前編譯好并做成軟件包&#xff0c;…

VGG改進(3):基于Cross Attention的VGG16增強方案

第一部分&#xff1a;交叉注意力機制解析1.1 注意力機制基礎注意力機制的核心思想是模擬人類的選擇性注意力——在處理信息時&#xff0c;對重要部分分配更多"注意力"。在神經網絡中&#xff0c;這意味著模型可以學習動態地加權輸入的不同部分。傳統的自注意力(Self-…

代理ip平臺哪家好?專業代理IP服務商測評排行推薦

隨著互聯網的深度發展&#xff0c;通過網絡來獲取全球化的信息資源&#xff0c;已成為企業與機構在競爭中保持優勢的一大舉措。但想要獲取其他地區的信息&#xff0c;可能需要我們通過代理IP來實現。代理IP平臺哪家好&#xff1f;下文就讓我們從IP池資源與技術優勢等細節&#…

PWA》》以京東為例安裝到PC端

如果訪問 瀏覽器右側出現 安裝 或 點擊這個 也可以完成安裝桌面 會出現 如下圖標

Linux系統:C語言進程間通信信號(Signal)

1. 引言&#xff1a;從"中斷"到"信號"想象一下&#xff0c;你正在書房專心致志地寫代碼&#xff0c;這時廚房的水燒開了&#xff0c;鳴笛聲大作。你會怎么做&#xff1f;你會暫停&#xff08;Interrupt&#xff09; 手頭的工作&#xff0c;跑去廚房關掉燒水…

LoRa 網關組網方案(二)

LoRa 網關組網方案 現有需求&#xff1a;網關每6秒接收不同節點的數據&#xff0c;使用SX1262芯片。 以下是完整的組網方案&#xff1a;1. 網絡架構設計 采用星型拓撲&#xff1a; 網關&#xff1a;作為中心節點&#xff0c;持續監聽多個信道節點&#xff1a;分布在網關周圍&am…

服裝外貿系統軟件怎么用才高效防風險?

服裝外貿系統軟件概述 服裝外貿系統軟件&#xff0c;如“艾格文ERP”&#xff0c;是現代外貿企業不可或缺的管理工具。它整合了訂單處理、庫存管理、客戶資源保護、財務控制等多功能模塊&#xff0c;旨在全面提升業務運營效率。通過系統化的管理方式&#xff0c;艾格文ERP能夠從…

【沉浸式解決問題】peewee.ImproperlyConfigured: MySQL driver not installed!

目錄一、問題描述二、原因分析三、解決方案? 推薦&#xff1a;安裝 pymysql&#xff08;純 Python&#xff0c;跨平臺&#xff0c;安裝簡單&#xff09;? 可選&#xff1a;安裝 mysqlclient&#xff08;更快&#xff0c;但需要本地編譯環境&#xff09;? 總結四、mysql-conn…

C++進階-----C++11

作者前言 &#x1f382; ??????&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ?&#x1f382; 作者介紹&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

(論文速讀)航空軸承剩余壽命預測:多生成器GAN與CBAM融合的創新方法

論文題目&#xff1a;Remaining Useful Life Prediction Approach for Aviation Bearings Based on Multigenerator Generative Adversarial Network and CBAM&#xff08;基于多發生器生成對抗網絡和CBAM的航空軸承剩余使用壽命預測方法&#xff09;期刊&#xff1a;IEEE TRAN…

3ds Max 流體模擬終極指南:從創建到渲染,打造真實液體效果

流體模擬是提升 3D 場景真實感的重要技術之一。無論是模擬飛瀑流泉、杯中溢出的飲料&#xff0c;還是黏稠的蜂蜜或熔巖&#xff0c;熟練掌握流體動力學無疑能為你的作品增色不少。本文將以 3ds Max 為例&#xff0c;系統講解流體模擬的創建流程與渲染方法&#xff0c;幫助你實現…

《算法導論》第 35 章-近似算法

大家好&#xff01;今天我們深入拆解《算法導論》第 35 章 ——近似算法。對于 NP 難問題&#xff08;如旅行商、集合覆蓋&#xff09;&#xff0c;精確算法在大規模數據下往往 “力不從心”&#xff0c;而近似算法能在多項式時間內給出 “足夠好” 的解&#xff08;有嚴格的近…