我会为你讲解“springboot构造树形结构数据并查询的方法”的完整攻略,以下是步骤:
1.引入依赖
首先,在pom.xml
文件中引入mybatis-plus
和fastjson
依赖,用于操作数据库和处理Json数据。具体依赖如下:
<dependencies>
<dependency>
<groupId>com.baomidou.mybatisplus</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
2.构造树形结构数据
接下来,我们需要将数据库中的数据转换成树形结构数据。假设我们有以下数据表:
CREATE TABLE `tb_menu` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`menu_name` varchar(100) NOT NULL COMMENT '菜单名称',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`parent_id` int(11) DEFAULT NULL COMMENT '父级菜单ID',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='菜单表';
我们可以使用以下代码将数据表中的数据转换成树形结构数据:
@Service
public class MenuService {
@Autowired
private MenuMapper menuMapper;
public List<MenuNode> buildMenuTree() {
List<Menu> menuList = menuMapper.selectList(null);
// 将所有Menu对象转换成MenuNode对象
List<MenuNode> menuNodeList = menuList.stream()
.map(MenuNode::new)
.collect(Collectors.toList());
// 将MenuNode对象添加到Map中,key为菜单ID
Map<Integer, MenuNode> menuNodeMap = menuNodeList.stream()
.collect(Collectors.toMap(MenuNode::getId, menuNode -> menuNode));
// 遍历MenuNodeList,根据parent_id组合成树形结构
List<MenuNode> menuTree = new ArrayList<>();
for (MenuNode menuNode : menuNodeList) {
if (menuNode.getParentId() != null) {
MenuNode parentNode = menuNodeMap.get(menuNode.getParentId());
if (parentNode != null) {
parentNode.addChild(menuNode);
}
} else {
menuTree.add(menuNode);
}
}
return menuTree;
}
}
/**
* 用于存储菜单节点信息的JavaBean
*/
@Data
public class MenuNode {
private Integer id;
private String menuName;
private Integer orderNum;
private Integer parentId;
private List<MenuNode> children = new ArrayList<>();
public MenuNode(Menu menu) {
this.id = menu.getId();
this.menuName = menu.getMenuName();
this.orderNum = menu.getOrderNum();
this.parentId = menu.getParentId();
}
public void addChild(MenuNode menuNode) {
this.children.add(menuNode);
}
}
以上代码的实现方式是将所有的菜单数据存储到JavaBean中,并通过将parent_id
和id
属性进行关联,将菜单对象转换成树形结构数据。
3.查询树形结构数据
当我们需要查询菜单树时,我们可以使用以下代码:
@RestController
public class MenuController {
@Autowired
private MenuService menuService;
@GetMapping("/menu")
public String getMenu() {
List<MenuNode> menuTree = menuService.buildMenuTree();
// 将菜单树转换成Json格式返回
return JSON.toJSONString(menuTree);
}
}
当我们访问/menu
接口时,会返回格式化后的Json数据,如下所示:
[
{
"id": 1,
"menuName": "系统管理",
"orderNum": 1,
"parentId": null,
"children": [
{
"id": 2,
"menuName": "用户管理",
"orderNum": 1,
"parentId": 1,
"children": []
},
{
"id": 3,
"menuName": "角色管理",
"orderNum": 2,
"parentId": 1,
"children": []
}
]
},
{
"id": 4,
"menuName": "采购管理",
"orderNum": 2,
"parentId": null,
"children": [
{
"id": 5,
"menuName": "采购订单",
"orderNum": 1,
"parentId": 4,
"children": []
},
{
"id": 6,
"menuName": "采购入库",
"orderNum": 2,
"parentId": 4,
"children": []
}
]
}
]
接下来,我再提供一条示例,用于查询菜单树中某个节点的所有子节点信息。
@Service
public class MenuService {
@Autowired
private MenuMapper menuMapper;
public List<MenuNode> buildMenuTree() {
// 以下为构造菜单树的代码,此处省略......
// ...
// 返回完整的菜单树
return menuTree;
}
public List<Menu> getSubMenu(int menuId) {
List<Menu> subMenuList = new ArrayList<>();
List<MenuNode> menuTree = buildMenuTree();
handleSubMenu(menuTree, menuId, subMenuList);
return subMenuList;
}
private void handleSubMenu(List<MenuNode> menuNodes, int menuId, List<Menu> subMenuList) {
for (MenuNode menuNode : menuNodes) {
if (menuNode.getId().equals(menuId)) {
subMenuList.addAll(menuNode.getChildren().stream().map(MenuNode::convertToMenu).collect(Collectors.toList()));
} else {
handleSubMenu(menuNode.getChildren(), menuId, subMenuList);
}
}
}
}
以上代码中,getSubMenu
方法用于查询菜单树中某个节点的所有子节点信息。我们首先调用buildMenuTree
方法,获取完整的菜单树。然后,我们通过递归遍历菜单树,获取目标节点的所有子节点信息,并保存到subMenuList
变量中。最后,我们将子节点信息返回即可。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot构造树形结构数据并查询的方法 - Python技术站