我的项目环境:mybaits plus
我负责的模块:course_category(课程分类模块)
方法一,传统的遍历组装
这一个方法有问题,先别用
方法二,Hutool自带TreeUtil
java
@GetMapping("/tree2")
public List tree() {
// 1.取出所有的课程分类
List<CourseCategory> list = categoryService.list();
// 2. Hutool 配置
TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
// 3.设置一下这个最大深度,建议必须设置
treeNodeConfig.setDeep(2);
// 3. 直接生成树(根节点 parentId = "0")
List<Tree<String>> tree = TreeUtil.build(
list,
"0",
treeNodeConfig,
(category, treeNode) -> {
// 一定要setId和setParentId才会出现树
treeNode.setId(category.getId());
treeNode.setParentId(category.getParentId());
treeNode.setName(category.getCategoryName());
//下面是用allgetset插件一键取出这个类的所有
String categoryCode = category.getCategoryCode();
Integer level = category.getLevel();
String parentId = category.getParentId();
LocalDateTime createTime = category.getCreateTime();
String createBy = category.getCreateBy();
Integer courseCount = category.getCourseCount();
Integer subCategoryCount = category.getSubCategoryCount();
Integer totalCourseCount = category.getTotalCourseCount();
List<CourseCategory> children = category.getChildren();
// 把上面取出来的值都putExtra进去,除了children。children他会自动组装
// children不能添加,肯定会出现问题
treeNode.putExtra("categoryCode", categoryCode);
treeNode.putExtra("level", level);
treeNode.putExtra("parentId", parentId);
treeNode.putExtra("createTime", createTime);
treeNode.putExtra("createBy", createBy);
treeNode.putExtra("courseCount", courseCount);
treeNode.putExtra("subCategoryCount", subCategoryCount);
treeNode.putExtra("totalCourseCount", totalCourseCount);
}
);
return tree;
}
返回结果:(id,parentId,name是set进去的,children是自动组装的,其他的字段要通过putExtra)
java
[
{
"id": "18bfc4df4e7b462eaf125b5999a20edf",
"parentId": "0",
"name": "组织协同",
"categoryCode": "10000258",
"level": 1,
"createTime": "2025-08-19T13:39:05",
"createBy": "cs_huiren",
"courseCount": 0,
"subCategoryCount": 1,
"totalCourseCount": 1,
"children": [
{
"id": "2f46ba4e2cec46eaab1a9a6c313bc503",
"parentId": "18bfc4df4e7b462eaf125b5999a20edf",
"name": "领导力培养",
"categoryCode": "21AD45AF",
"level": 2,
"createTime": "2025-08-19T13:39:22",
"createBy": "cs_huiren",
"courseCount": 1,
"subCategoryCount": 0,
"totalCourseCount": 1,
"children": null
}
]
},
{
"id": "812b471578f34044a9ccf5da00022e61",
"parentId": "0",
"name": "项目管理 ",
"categoryCode": "10007462",
"level": 1,
"createTime": "2025-08-13T08:26:04",
"createBy": "cs_huiren",
"courseCount": 2,
"subCategoryCount": 5,
"totalCourseCount": 7,
"children": [
{
"id": "3e9c662f66d64744aabea94ba9002dfa",
"parentId": "812b471578f34044a9ccf5da00022e61",
"name": "职能支撑 ",
"categoryCode": "280EE3C3",
"level": 2,
"createTime": "2025-08-13T09:06:05",
"createBy": "cs_huiren",
"courseCount": 4,
"subCategoryCount": 4,
"totalCourseCount": 5,
"children": null
}
]
},
{
"id": "98c858bfa9114c18bc2c60db6e40c8c0",
"parentId": "0",
"name": "技术文档",
"categoryCode": "10001069",
"level": 1,
"createTime": "2025-08-13T09:31:52",
"createBy": "cs_huiren",
"courseCount": 2,
"subCategoryCount": 0,
"totalCourseCount": 2
}
]
方法三,mybatisplus自带
MyBatis-Plus 从 3.5.3 开始 已经在 mybatis-plus-extension 中自带了 无限层级树 的工具方法,不用自己写任何递归。
java
@Data
@TableName("category")
public class Category {
private String id; // 主键
private String parentId; // 父节点
private String categoryName;
// 子节点,名字固定叫 children
@TableField(exist = false)
private List<Category> children = new ArrayList<>();
}
java
@RestController
@RequiredArgsConstructor
public class CategoryController {
private final CategoryMapper categoryMapper;
@GetMapping("/tree")
public List<Category> tree() {
return TreeHelper.build(
categoryMapper.selectList(null),
Category::getId,
Category::getParentId,
Category::getChildren
);
}
}