下面我给你详细讲解“SpringBoot+MyBatisPlus+MySQL8实现树形结构查询”的完整攻略。
一、概述
在开发中,树形结构的数据查询操作是比较常见的,而使用SpringBoot+MyBatisPlus+MySQL8来实现树形结构的查询则是一种比较简单直观的方法。
二、步骤
1. 创建数据库表
首先,我们需要在MySQL8中创建一个数据表来存储我们的树形结构数据。在本次示例中,假设我们创建的表名为“tree”,包含三个字段:id、name和parent_id。其中,id为主键,parent_id为外键,如下所示:
CREATE TABLE `tree` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`parent_id` bigint DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
2. 配置依赖项
接下来,我们需要配置SpringBoot和MyBatisPlus的相关依赖项。在本次示例中,我们将使用Gradle来管理项目,在build.gradle文件中添加如下配置:
plugins {
id 'org.springframework.boot' version '2.5.0'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java.sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'com.baomidou:mybatis-plus-boot-starter:3.4.3'
implementation 'mysql:mysql-connector-java:8.0.24'
}
3. 创建实体类
接下来,我们需要创建一个实体类来映射数据库表中的数据。在本次示例中,我们创建的实体类名为“Tree”,其中包含id、name和parentId三个属性的getter和setter方法。
public class Tree {
private Long id;
private String name;
private Long parentId;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getParentId() {
return parentId;
}
public void setParentId(Long parentId) {
this.parentId = parentId;
}
}
4. 创建Mapper类
Mapper类是MyBatisPlus中用于访问数据库的接口。在本次示例中,我们需要创建一个Mapper类来实现对树形结构数据的查询。具体代码如下:
public interface TreeMapper extends BaseMapper<Tree> {
@Select("SELECT * FROM tree WHERE parent_id is NULL")
List<Tree> selectTopNodes();
@Select("SELECT * FROM tree WHERE parent_id=#{parentId}")
List<Tree> selectByParentId(Long parentId);
}
其中,selectTopNodes方法用于查询根节点,selectByParentId方法用于查询指定父节点下的所有子孙节点。
5. 创建Service类
接下来,我们需要创建Service类来实现树形结构数据的查询。具体代码如下:
@Service
public class TreeService {
@Autowired
private TreeMapper treeMapper;
public List<Tree> getTree() {
List<Tree> treeList = new ArrayList<>();
List<Tree> topNodes = treeMapper.selectTopNodes();
for (Tree topNode : topNodes) {
List<Tree> childList = getChildren(topNode.getId());
topNode.setChildren(childList);
treeList.add(topNode);
}
return treeList;
}
private List<Tree> getChildren(Long parentId) {
List<Tree> childList = new ArrayList<>();
List<Tree> nodes = treeMapper.selectByParentId(parentId);
for (Tree node : nodes) {
List<Tree> grandChildren = getChildren(node.getId());
if(!CollectionUtils.isEmpty(grandChildren)) {
node.setChildren(grandChildren);
}
childList.add(node);
}
return childList;
}
}
其中,getTree方法用于获取整个树形结构数据,getChildren方法用于递归获取某个节点下的所有子孙节点,并将其设置为该节点的children属性值。
6. 创建Controller类
最后,我们需要创建Controller类来实现对树形结构数据的查询。具体代码如下:
@RestController
@RequestMapping("trees")
public class TreeController {
@Autowired
private TreeService treeService;
@GetMapping
public List<Tree> getTree() {
return treeService.getTree();
}
}
完成以上步骤后,我们就可以通过访问http://localhost:8080/trees来获取整个树形结构数据。
三、示例
为了更好地理解上述步骤,下面我给出两个示例。
示例一
假设我们有如下数据:
id | name | parent_id |
---|---|---|
1 | node1 | null |
2 | node2 | null |
3 | node3 | 1 |
4 | node4 | 2 |
5 | node5 | 3 |
6 | node6 | 4 |
则整个树形结构如下图所示:
- node1
- node3
- node5
- node2
- node4
- node6
示例二
假设我们有如下数据:
id | name | parent_id |
---|---|---|
1 | node1 | null |
2 | node2 | null |
3 | node3 | 1 |
4 | node4 | 2 |
5 | node5 | 3 |
则整个树形结构如下图所示:
- node1
- node3
- node5
- node2
- node4
注意:示例二中没有子孙节点的叶子节点没有children属性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot+MyBatisPlus+MySQL8实现树形结构查询 - Python技术站