• 数据库查询层级结构


    目的:我们要查一个菜单,菜单有个parent_id字段,可以绑定父级餐单,我们想让他展示层树的形态返回数据。即下图

    1. {
    2. "menuId": 0,
    3. "menuName": "首页",
    4. "permissions": [
    5. {
    6. "menuId": 40,
    7. "menuName": "游戏管理",
    8. "parentId": 0,
    9. "isSelected": 1,
    10. "permissions": [
    11. {
    12. "menuId": 41,
    13. "menuName": "游戏基本信息",
    14. "parentId": 40,
    15. "isSelected": 1
    16. },
    17. {
    18. "menuId": 42,
    19. "menuName": "游戏客户端",
    20. "parentId": 40,
    21. "isSelected": 1
    22. },
    23. {
    24. "menuId": 43,
    25. "menuName": "游戏更新",
    26. "parentId": 40,
    27. "isSelected": 1
    28. },
    29. {
    30. "menuId": 66,
    31. "menuName": "游戏白名单列表",
    32. "parentId": 40,
    33. "isSelected": 1
    34. },
    35. {
    36. "menuId": 79,
    37. "menuName": "游戏数据",
    38. "parentId": 40,
    39. "isSelected": 1
    40. },
    41. {
    42. "menuId": 83,
    43. "menuName": "留存数据",
    44. "parentId": 40,
    45. "isSelected": 1
    46. },
    47. {
    48. "menuId": 85,
    49. "menuName": "测试白名单",
    50. "parentId": 40,
    51. "isSelected": 1
    52. },
    53. {
    54. "menuId": 89,
    55. "menuName": "双端互通",
    56. "parentId": 40,
    57. "isSelected": 1
    58. },
    59. {
    60. "menuId": 115,
    61. "menuName": "游戏公告",
    62. "parentId": 40,
    63. "isSelected": 1
    64. },
    65. {
    66. "menuId": 120,
    67. "menuName": "游戏Ltv",
    68. "parentId": 40,
    69. "isSelected": 1
    70. },
    71. {
    72. "menuId": 129,
    73. "menuName": "游戏Ltv",
    74. "parentId": 40,
    75. "isSelected": 1
    76. }
    77. ]
    78. },
    79. {
    80. "menuId": 44,
    81. "menuName": "用户管理",
    82. "parentId": 0,
    83. "isSelected": 1,
    84. "permissions": [
    85. {
    86. "menuId": 45,
    87. "menuName": "用户详情",
    88. "parentId": 44,
    89. "isSelected": 1
    90. },
    91. {
    92. "menuId": 46,
    93. "menuName": "用户日志",
    94. "parentId": 44,
    95. "isSelected": 1,
    96. "permissions": [
    97. {
    98. "menuId": 48,
    99. "menuName": "用户行为日志",
    100. "parentId": 46,
    101. "isSelected": 1
    102. },
    103. {
    104. "menuId": 49,
    105. "menuName": "用户设备日志",
    106. "parentId": 46,
    107. "isSelected": 1
    108. }
    109. ]
    110. }
    111. ]
    112. },
    113. {
    114. "menuId": 50,
    115. "menuName": "消费管理",
    116. "parentId": 0,
    117. "isSelected": 1,
    118. "permissions": [
    119. {
    120. "menuId": 51,
    121. "menuName": "订单管理",
    122. "parentId": 50,
    123. "isSelected": 1
    124. },
    125. {
    126. "menuId": 64,
    127. "menuName": "商品管理",
    128. "parentId": 50,
    129. "isSelected": 1
    130. }
    131. ]
    132. },
    133. {
    134. "menuId": 59,
    135. "menuName": "通用管理",
    136. "parentId": 0,
    137. "isSelected": 1,
    138. "permissions": [
    139. {
    140. "menuId": 60,
    141. "menuName": "全局配置",
    142. "parentId": 59,
    143. "isSelected": 1
    144. },
    145. {
    146. "menuId": 61,
    147. "menuName": "系统配置",
    148. "parentId": 59,
    149. "isSelected": 1
    150. },
    151. {
    152. "menuId": 62,
    153. "menuName": "权限管理",
    154. "parentId": 59,
    155. "isSelected": 1
    156. },
    157. {
    158. "menuId": 122,
    159. "menuName": "角色管理",
    160. "parentId": 59,
    161. "isSelected": 1
    162. }
    163. ]
    164. },
    165. {
    166. "menuId": 97,
    167. "menuName": "官网管理",
    168. "parentId": 0,
    169. "isSelected": 1,
    170. "permissions": [
    171. {
    172. "menuId": 98,
    173. "menuName": "官网游戏管理",
    174. "parentId": 97,
    175. "isSelected": 1
    176. },
    177. {
    178. "menuId": 99,
    179. "menuName": "礼包管理",
    180. "parentId": 97,
    181. "isSelected": 1
    182. }
    183. ]
    184. }
    185. ]
    186. }

    解决方法:

    1.数据库查询出的结果就具有层级结构,通过写数据库语句实现

    SQL 层级查询(一) - 腾讯云开发者社区-腾讯云 (tencent.com)

    2.我们将查询出来的数据进行改装,通过java代码的形式,使其变成层级结构

    第一步,数据库语句查询

    可以看到,我们的菜单都有个父级菜单字段,我们除了查询餐单id,菜单名称,还要把父级id查询出来

    第二步,写个DTO类,用于存数据,DTO类需要有个List<自己>的字段

     第三步,编写数据转为树形结构Java代码

    1. /**
    2. * 将数据库中的菜单转换为树形结构
    3. *
    4. * @param permissionDOs 系统菜单
    5. * @return 树形结构
    6. *
    7. */
    8. public static PermissionDTO getMenuTreeByRole(List permissionDOs) {
    9. Map> systemMenuMap = permissionDOs.stream()
    10. .collect(Collectors.groupingBy(PermissionDTO::getParentId));
    11. PermissionDTO permissionDTO = new PermissionDTO();
    12. permissionDTO.setMenuId(0);
    13. permissionDTO.setMenuName("首页");
    14. listToTreeByRole(systemMenuMap, permissionDTO);
    15. return permissionDTO;
    16. }
    17. /**
    18. * 将列表转换为树形结构
    19. *
    20. * @param collect 列表
    21. * @param permissionDTO 角色权限
    22. */
    23. private static void listToTreeByRole(Map> collect, PermissionDTO permissionDTO) {
    24. List treeMenuNodes = collect.get(permissionDTO.getMenuId());
    25. if (!CollectionUtils.isEmpty(treeMenuNodes)) {
    26. List permissions = new ArrayList<>();
    27. BeanCopyUtil.copyColl(treeMenuNodes, permissions, PermissionDTO.class);
    28. permissionDTO.setPermissions(permissions);
    29. permissionDTO.getPermissions().forEach(t -> listToTreeByRole(collect, t));
    30. }
    31. }

    方法解读:

    1.首先,我们将得到的数据库数据通过parent_id进行分组,即map结构,key为parent_id,value为组成员

     2.设置第一级菜单,即没有父级菜单id为0的,调用递归方法listToTreeByRole,设置他的自己菜单

    3.递归方法第一步,即通过当前菜单id,从我们的map中获取其子菜单(前面我们的map分过组了,所以我们可以很容易的得到当前key下的子菜单)

     4.子菜单不为空,就把子菜单绑定到当前菜单对象的下面

    5.递归,对子菜单执行操作

    6.结果

    得到一个PermissionDTO对象 

    递归结构:

  • 相关阅读:
    [附源码]java毕业设计高校教师教学工作量核算系统
    java基础10题
    攻防世界WEB练习-favorite_number
    Go并发的非阻塞缓存
    谈谈Android Jetpack Compose中的状态提升
    GL Studio 5 安装与体验
    Redis集群:远程主机强迫关闭了一个现有的连接。
    Neo4j-Graph数据库技能树学习体验及一些建议
    Docker Desktop使用入门
    使用s3 api访问AWS S3服务
  • 原文地址:https://blog.csdn.net/qq_33879443/article/details/127800352