树形结构通用工具类
准备数据
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sys_dept
-- ----------------------------
DROP TABLE IF EXISTS `sys_dept`;
CREATE TABLE `sys_dept` (
`dept_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '部门名称',
`parent_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '父级编号',
`dept_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门名称',
`sort` int(11) NULL DEFAULT NULL COMMENT '排序',
`leader` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '负责人',
`phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系方式',
`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱',
`status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门状态',
`create_by` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
`remark` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注',
`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '详细地址',
PRIMARY KEY (`dept_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_dept
-- ----------------------------
INSERT INTO `sys_dept` VALUES ('1', '0', '济南总公司', 1, '就眠仪式', '15553726531', 'pearadmin@gmail.com', '0', NULL, NULL, NULL, NULL, NULL, '山东济南');
INSERT INTO `sys_dept` VALUES ('10', '8', '设计部', 3, '就眠仪式', '15553726531', 'pearadmin@gmail.com', '0', NULL, NULL, NULL, NULL, NULL, '山东济南');
INSERT INTO `sys_dept` VALUES ('1316361008259792896', '1316360459930042368', '软件部', 1, '就眠仪式', '15553726531', 'pearadmin@gmail.com', '0', NULL, NULL, NULL, NULL, NULL, '山东济南');
INSERT INTO `sys_dept` VALUES ('1316361192645591040', '1316360459930042368', '市场部', 1, '就眠仪式', '15553726531', 'pearadmin@gmail.com', '0', NULL, NULL, NULL, NULL, NULL, '山东济南');
INSERT INTO `sys_dept` VALUES ('1377824449830584320', '3', '财务部', 1, '就眠仪式', '15553726531', '854085467@qq.com', '0', NULL, NULL, NULL, NULL, NULL, '山东济南');
INSERT INTO `sys_dept` VALUES ('1377825171905183744', '8', '财务部', 1, '就眠仪式', '15553726531', '854085467@qq.com', '0', NULL, NULL, NULL, NULL, NULL, '山东济南');
INSERT INTO `sys_dept` VALUES ('3', '1', '杭州分公司', 1, '就眠仪式', '15553726531', 'pearadmin@gmail.com', '0', NULL, NULL, NULL, NULL, NULL, '浙江杭州');
INSERT INTO `sys_dept` VALUES ('4', '2', '软件部', 2, '就眠仪式', '15553726531', 'pearadmin@gmail.com', '0', NULL, NULL, NULL, NULL, NULL, '山东济南');
INSERT INTO `sys_dept` VALUES ('5', '2', '市场部', 2, '就眠仪式', '15553726531', 'pearadmin@gmail.com', '0', NULL, NULL, NULL, NULL, NULL, '山东济南');
INSERT INTO `sys_dept` VALUES ('6', '3', '软件部', 3, '就眠仪式', '15553726531', 'pearadmin@gmail.com', '0', NULL, NULL, NULL, NULL, NULL, '浙江杭州');
INSERT INTO `sys_dept` VALUES ('7', '3', '设计部', 4, '就眠仪式', '15553726531', 'pearadmin@gmail.com', '0', NULL, NULL, NULL, NULL, NULL, '山东济南');
INSERT INTO `sys_dept` VALUES ('8', '1', '深圳分公司', 3, '就眠仪式', '15553726531', 'pearadmin@gmail.com', '0', NULL, NULL, NULL, NULL, NULL, '山东济南');
INSERT INTO `sys_dept` VALUES ('9', '8', '软件部', 3, '就眠仪式', '15553726531', 'pearadmin@gmail.com', '0', NULL, NULL, NULL, NULL, NULL, '山东济南');
SET FOREIGN_KEY_CHECKS = 1;
测试准备
springboot项目
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
说明:
使用 hutool 开源项目的 db 模块 , 快速进行数据库操作
工具类
创建数据库连接工具类
DataSourceInit.java
public class DataSourceInit {
public static DataSource initDatasource(
Class<DataSource> type,
String driver ,
String url,
String user ,
String pass){
DataSource build = DataSourceBuilder.create()
// 设置为 mysql 数据源
.type(type)
.driverClassName(driver)
.url(url)
.password(user)
.username(pass)
.build();
return build;
}
public static DataSource initMySQLDatasource(
String driver ,
String url,
String user ,
String pass){
DataSource build = DataSourceBuilder.create()
// 设置为 mysql 数据源
.type(MysqlDataSource.class)
.driverClassName(driver)
.url(url)
.password(user)
.username(pass)
.build();
return build;
}
}
准备树形结构的类
package com.example.data;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.List;
public class TreeDataByMysql {
public static List<SysDept> getTreeData() throws SQLException {
DataSource dataSource = DataSourceInit.initMySQLDatasource("jdbc:mysql://www.shaoming.club:3306/pear_admin"
, "jdbc:mysql://www.shaoming.club:3306/pear_admin",
"root", "root");
Db db = Db.use(dataSource);
List<SysDept> sysDeptList = db.findAll(Entity.create("sys_dept"), SysDept.class);
return sysDeptList;
}
}
测试类
package com.example.test.tree;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.json.JSONUtil;
import com.example.data.SysDept;
import com.example.data.TreeDataByMysql;
import java.sql.SQLException;
import java.util.List;
public class TreeTest {
public static void main(String[] args) throws SQLException {
List<SysDept> treeData = TreeDataByMysql.getTreeData();
//配置
TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
// 改变子集的属性名称 , 有默认值 , 默认值为 children , 我们可以进行自定义
treeNodeConfig.setChildrenKey("child");
// 自定义属性名 都要默认值的 , 可以自定义概知 , 比如为 sortvalue
treeNodeConfig.setWeightKey("sort");
//treeNodeConfig.setWeightKey("sortvalue");
treeNodeConfig.setIdKey("deptId");
// 最大递归深度
treeNodeConfig.setDeep(3);
//转换器
List<Tree<String>> treeNodes = TreeUtil.build(treeData, "0", treeNodeConfig,
(treeNode, tree) -> {
tree.setId(treeNode.getDeptId());
tree.setParentId(treeNode.getParentId());
// 可以按照比重从小到大排序
tree.setWeight(treeNode.getSort());
// 可以按照比重从大到小排序 , 把排序值变为负数 (-)
//tree.setWeight(-treeNode.getSort());
tree.setName(treeNode.getDeptName());
// 扩展属性 ...
tree.putExtra("extraField", "扩展字段");
});
System.out.println(JSONUtil.toJsonPrettyStr(treeNodes));
System.out.println("---------------------------------------------------=============>");
// hutool 官网的入门案例
// List<TreeNode<String>> nodeList = CollUtil.newArrayList();
// nodeList.add(new TreeNode<>("1", "0", "系统管理", 5));
// nodeList.add(new TreeNode<>("11", "1", "用户管理", 222222));
// nodeList.add(new TreeNode<>("111", "11", "用户添加", 0));
// nodeList.add(new TreeNode<>("2", "0", "店铺管理", 1));
// nodeList.add(new TreeNode<>("21", "2", "商品管理", 44));
// nodeList.add(new TreeNode<>("221", "2", "商品管理2", 2));
// // 0表示最顶层的id是0
// List<Tree<String>> treeList = TreeUtil.build(nodeList, "0");
// System.out.println(treeList);
// System.out.println(JSONUtil.toJsonPrettyStr(treeList));
}
}
控制台打印
[
{
“deptId”: “1”,
“parentId”: “0”,
“sort”: -1,
“name”: “济南总公司”,
“extraField”: “扩展字段”,
“child”: [
{
“deptId”: “8”,
“parentId”: “1”,
“sort”: -3,
“name”: “深圳分公司”,
“extraField”: “扩展字段”,
“child”: [
{
“deptId”: “9”,
“parentId”: “8”,
“sort”: -3,
“name”: “软件部”,
“extraField”: “扩展字段”
},
{
“deptId”: “10”,
“parentId”: “8”,
“sort”: -3,
“name”: “设计部”,
“extraField”: “扩展字段”
},
{
“deptId”: “1377825171905183744”,
“parentId”: “8”,
“sort”: -1,
“name”: “财务部”,
“extraField”: “扩展字段”
}
]
},
{
“deptId”: “3”,
“parentId”: “1”,
“sort”: -1,
“name”: “杭州分公司”,
“extraField”: “扩展字段”,
“child”: [
{
“deptId”: “7”,
“parentId”: “3”,
“sort”: -4,
“name”: “设计部”,
“extraField”: “扩展字段”
},
{
“deptId”: “6”,
“parentId”: “3”,
“sort”: -3,
“name”: “软件部”,
“extraField”: “扩展字段”
},
{
“deptId”: “1377824449830584320”,
“parentId”: “3”,
“sort”: -1,
“name”: “财务部”,
“extraField”: “扩展字段”
}
]
}
]
}
]
---------------------------------------------------=============>