这篇文章将为大家详细讲解有关Java递归如何实现菜单树,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
pom文件
<?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文件
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
数据库表设计如下
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;
菜单类
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文件
<?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层
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层
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
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层
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;
}
}
结果展示
关于“Java递归如何实现菜单树”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。