好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java递归实现菜单树的方法详解

pom文件

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

<? xml version = "1.0" encoding = "UTF-8" ?>

< project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"

          xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" >

     < modelVersion >4.0.0</ modelVersion >

     < parent >

         < groupId >org.springframework.boot</ groupId >

         < artifactId >spring-boot-starter-parent</ artifactId >

         <!--  可选修改:之前的一些案例按照此版本搭建      -->

         < version >2.1.3.RELEASE</ version >

         < relativePath /> <!-- lookup parent from repository -->

     </ parent >

     < groupId >com.example</ groupId >

     < artifactId >demo</ artifactId >

     < version >0.0.1-SNAPSHOT</ version >

     < name >demo</ name >

     < description >Demo project for Spring Boot</ description >

     < properties >

         < java.version >1.8</ java.version >

     </ properties >

     < dependencies >

         < dependency >

             < groupId >org.springframework.boot</ groupId >

             < artifactId >spring-boot-starter</ artifactId >

         </ dependency >

         < dependency >

             < groupId >org.springframework.boot</ groupId >

             < artifactId >spring-boot-starter-web</ artifactId >

         </ dependency >

         < dependency >

             < groupId >org.springframework.boot</ groupId >

             < artifactId >spring-boot-starter-thymeleaf</ artifactId >

         </ dependency >

         < dependency >

             < groupId >org.springframework.boot</ groupId >

             < artifactId >spring-boot-starter-test</ artifactId >

             < scope >test</ scope >

         </ dependency >

         <!--  spring boot 整合mybatis的核心依赖-->

         < dependency >

             < groupId >org.mybatis.spring.boot</ groupId >

             < artifactId >mybatis-spring-boot-starter</ artifactId >

             < version >2.1.1</ version >

         </ dependency >

         <!--        数据库驱动-->

         < dependency >

             < groupId >mysql</ groupId >

             < artifactId >mysql-connector-java</ artifactId >

             < scope >runtime</ scope >

         </ dependency >

         <!--pageHelper分页插件-->

         < dependency >

             < groupId >com.github.pagehelper</ groupId >

             < artifactId >pagehelper-spring-boot-starter</ artifactId >

             < version >1.3.0</ version >

         </ dependency >

         <!-- 引入lombok,简化pojo类-->

         < dependency >

             < groupId >org.projectlombok</ groupId >

             < artifactId >lombok</ artifactId >

             < optional >true</ optional >

         </ dependency >

         <!--        引入Mybatis plus 依赖  增强mybatis-->

         < dependency >

             < groupId >com.baomidou</ groupId >

             < artifactId >mybatis-plus-boot-starter</ artifactId >

             < version >3.4.2</ version >

         </ dependency >

     </ dependencies >

     < build >

         < plugins >

             < plugin >

                 < groupId >org.springframework.boot</ groupId >

                 < artifactId >spring-boot-maven-plugin</ artifactId >

             </ plugin >

         </ plugins >

     </ build >

</ project >

 application.yaml文件

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

spring:

   datasource:  

     url: jdbc:mysql: //localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&serverTimezone=CTT

     username: root

     password: 2020

     driver- class -name: com.mysql.cj.jdbc.Driver

pagehelper:

   helperDialect: mysql

   reasonable: true # 修改默认值

# mybatis-plus配置

mybatis-plus:

   configuration:

     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

   typeAliasesPackage: com.qcby.entity

   mapperLocations: classpath:mapper/*.xml

   # 全局配置id自增  =>

   global-config:

     db-config:

       id-type: auto

数据库表设计如下

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

SET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------

-- Table structure for menu

-- ----------------------------

DROP TABLE IF EXISTS `menu`;

CREATE TABLE `menu`  (

   `id` bigint (20) NOT NULL AUTO_INCREMENT COMMENT '主键id' ,

   ` name ` varchar (255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '名称' ,

   `pid` bigint (20) DEFAULT NULL COMMENT '父级id' ,

   PRIMARY KEY (`id`) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Compact;

-- ----------------------------

-- Records of menu

-- ----------------------------

INSERT INTO `menu` VALUES (1, '主菜单1' , 0);

INSERT INTO `menu` VALUES (2, '主菜单2' , 0);

INSERT INTO `menu` VALUES (3, '主菜单3' , 0);

INSERT INTO `menu` VALUES (4, '菜单1.1' , 1);

INSERT INTO `menu` VALUES (5, '菜单1.2' , 1);

INSERT INTO `menu` VALUES (6, '菜单1.1.1' , 4);

INSERT INTO `menu` VALUES (7, '菜单2.1' , 2);

INSERT INTO `menu` VALUES (8, '菜单2.2' , 2);

INSERT INTO `menu` VALUES (9, '菜单1.1.2' , 4);

SET FOREIGN_KEY_CHECKS = 1;

菜单类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

package com.qcby.entity;

import lombok.Data;

import java.util.List;

@Data //lombok实现简化 get、set、tostring方法

public class Menu {

     // 菜单id

     private String  id;

     //菜单名称

     private String name;

     // 父菜单id

     private String pid;

     // 子菜单

     private List<Menu> menuChildren;

}

xml文件

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<? xml version = "1.0" encoding = "UTF-8" ?>

<!DOCTYPE mapper

         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

< mapper namespace = "com.qcby.mapper.MenuMapper" >

     < select id = "selectByPid" resultType = "com.qcby.entity.Menu" >

         SELECT * FROM menu WHERE  pid=#{pid}

     </ select >

     < select id = "selectAll" resultType = "com.qcby.entity.Menu" >

         SELECT * FROM menu

     </ select >

     < select id = "selectAllNotBase" resultType = "com.qcby.entity.Menu" >

         SELECT * FROM menu where pid!= 0

     </ select >

</ mapper >

Mapper层

?

1

2

3

4

5

6

7

8

9

10

11

package com.qcby.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import com.qcby.entity.Menu;

import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper

public interface MenuMapper extends BaseMapper<Menu> {

     List<Menu> selectByPid(Integer pid);

     List<Menu> selectAll();

     List<Menu> selectAllNotBase();

}

service层

?

1

2

3

4

5

6

7

8

9

package com.qcby.service;

import com.baomidou.mybatisplus.extension.service.IService;

import com.qcby.entity.Menu;

import java.util.List;

public interface MenuService extends IService<Menu> {

     List<Menu> selectByPid(Integer pid);

     List<Menu> selectAll();

     List<Menu> selectAllNotBase();

}

serviceImpl

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

package com.qcby.service.Impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import com.qcby.entity.Menu;

import com.qcby.mapper.MenuMapper;

import com.qcby.service.MenuService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import java.util.List;

@Service

public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements MenuService {

     @Autowired

     private MenuMapper menuMapper;

     @Override

     public List<Menu> selectByPid(Integer pid) {

         return menuMapper.selectByPid(pid);

     }

     @Override

     public List<Menu> selectAll() {

         return menuMapper.selectAll();

     }

     @Override

     public List<Menu> selectAllNotBase() {

         return menuMapper.selectAllNotBase();

     }

}

controller层

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

package com.qcby.controller;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;

import com.qcby.entity.Menu;

import com.qcby.mapper.MenuMapper;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;

import java.util.List;

@RestController

@RequestMapping ( "menu" )

public class MenuController {

     @Autowired

     private MenuMapper menuMapper;

     @RequestMapping ( "/getMenuTree" )

     public List<Menu> getMenuTree(){

         List<Menu> menusBase = menuMapper.selectByPid( 0 );

         List<Menu> menuLNotBase = menuMapper.selectAllNotBase();

         for (Menu menu : menusBase) {

             List<Menu> menus = iterateMenus(menuLNotBase, menu.getId());

             menu.setMenuChildren(menus);

         }

         return   menusBase;

     }

     /**

      *多级菜单查询方法

      * @param menuVoList 不包含最高层次菜单的菜单集合

      * @param pid 父类id

      * @return

      */

     public List<Menu> iterateMenus(List<Menu> menuVoList,String pid){

         List<Menu> result = new ArrayList<Menu>();

         for (Menu menu : menuVoList) {

             //获取菜单的id

             String menuid = menu.getId();

             //获取菜单的父id

             String parentid = menu.getPid();

             if (StringUtils.isNotBlank(parentid)){

                 if (parentid.equals(pid)){

                     //递归查询当前子菜单的子菜单

                     List<Menu> iterateMenu = iterateMenus(menuVoList,menuid);

                     menu.setMenuChildren(iterateMenu);

                     result.add(menu);

                 }

             }

         }

         return result;

     }

}

结果展示

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!    

原文链接:https://blog.csdn.net/m0_52012606/article/details/123780859

查看更多关于Java递归实现菜单树的方法详解的详细内容...

  阅读:13次