下面是关于使用Java和MySQL递归生成树形JSON列表的攻略。
下面是关于使用Java和MySQL递归生成树形JSON列表的攻略。
核心思路
树形结构实际上是一种递归结构,我们可以利用递归的思想来实现树形结构的生成。具体步骤如下:
- 从数据库中查询出所有的节点,包括节点的id、pid、name等信息;
- 创建根节点,将根节点放入节点列表中;
- 遍历节点列表,如果该节点的pid等于根节点的id,将该节点加入根节点的子节点中;
- 递归遍历该节点的子节点列表,加入子节点的子节点等,直到该节点的子节点为空为止;
- 将根节点转换为JSON格式的字符串。
代码实现
实体类
Java实体类主要包括节点的id、pid、name等信息。以Node实体类为例:
public class Node {
private Integer id;
private Integer pid;
private String name;
// 构造函数、Getter和Setter方法省略
}
数据库操作
MySQL数据库中的表结构如下:
CREATE TABLE `node` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`pid` int(11) unsigned DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
在Java中,我们使用JDBC操作MySQL数据库,建立连接、查询和关闭连接的代码如下:
public static Connection getConnection() throws SQLException {
String url = "jdbc:mysql://localhost:3306/test";
String username = "root";
String password = "123456";
return DriverManager.getConnection(url, username, password);
}
public static void closeConnection(Connection conn, Statement stmt, ResultSet rs) throws SQLException {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
public static List<Node> findAll() throws SQLException {
List<Node> nodeList = new ArrayList<>();
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = getConnection();
stmt = conn.prepareStatement("SELECT * FROM node");
rs = stmt.executeQuery();
while (rs.next()) {
Node node = new Node();
node.setId(rs.getInt("id"));
node.setPid(rs.getInt("pid"));
node.setName(rs.getString("name"));
nodeList.add(node);
}
} finally {
closeConnection(conn, stmt, rs);
}
return nodeList;
}
递归生成JSON
利用以上代码,我们可以查询出数据库中所有的节点集合。接下来我们需要利用递归的方式生成JSON字符串,代码如下:
public static String generateJson(Integer nodeId, List<Node> nodeList) {
List<Node> childNodes = getChildNodes(nodeId, nodeList);
StringBuilder sb = new StringBuilder();
if (!childNodes.isEmpty()) {
sb.append("[");
for (Node node : childNodes) {
sb.append("{");
sb.append("\"id\":\"").append(node.getId()).append("\",");
sb.append("\"name\":\"").append(node.getName()).append("\",");
sb.append("\"children\":").append(generateJson(node.getId(), nodeList));
sb.append("},");
}
sb.deleteCharAt(sb.length() - 1);
sb.append("]");
}
return sb.toString();
}
public static List<Node> getChildNodes(Integer nodeId, List<Node> nodeList) {
List<Node> childNodes = new ArrayList<>();
for (Node node : nodeList) {
if (node.getPid() != null && node.getPid().equals(nodeId)) {
childNodes.add(node);
}
}
return childNodes;
}
以上代码的generateJson方法接收一个节点id和节点列表,返回该节点的子节点列表生成的JSON字符串。如果该节点没有子节点,返回空字符串。getChildNodes方法接收一个节点id和节点列表,返回该节点的子节点列表。
完整示例请见下面两个示例。
示例一
以以下数据库中的数据为例:
id | pid | name |
---|---|---|
1 | null | root |
2 | 1 | node1 |
3 | 1 | node2 |
4 | 2 | node3 |
5 | null | node4 |
6 | 4 | node5 |
调用方法如下:
List<Node> nodeList = findAll();
String json = generateJson(1, nodeList);
System.out.println(json);
输出结果如下:
[
{
"id":"2",
"name":"node1",
"children":[
{
"id":"4",
"name":"node3",
"children":[
{
"id":"6",
"name":"node5",
"children":[]
}
]
}
]
},
{
"id":"3",
"name":"node2",
"children":[]
}
]
示例二
以以下数据库中的数据为例:
id | pid | name |
---|---|---|
1 | null | root |
2 | 1 | node1 |
3 | 1 | node2 |
4 | 2 | node3 |
5 | null | node4 |
6 | 4 | node5 |
7 | 3 | node6 |
调用方法如下:
List<Node> nodeList = findAll();
String json = generateJson(1, nodeList);
System.out.println(json);
输出结果如下:
[
{
"id":"2",
"name":"node1",
"children":[
{
"id":"4",
"name":"node3",
"children":[
{
"id":"6",
"name":"node5",
"children":[]
}
]
}
]
},
{
"id":"3",
"name":"node2",
"children":[
{
"id":"7",
"name":"node6",
"children":[]
}
]
}
]
以上即为利用Java和MySQL递归生成树形JSON列表的完整攻略和示例。
本文标题为:利用java+mysql递归实现拼接树形JSON列表的方法示例
基础教程推荐
- Java C++题解eetcode940不同的子序列 II 2023-06-17
- java实现登录注册界面 2023-01-13
- Java8新特性Optional类及新时间日期API示例详解 2023-07-01
- Java查看和修改线程优先级操作详解 2022-09-03
- 深入理解Java并发编程之ThreadLocal 2023-03-22
- JVM的常用命令汇总 2023-06-23
- jQuery 重复加载错误以及修复方法 2024-01-13
- 详解SpringMVC中的四种跳转方式、视图解析器问题 2023-06-30
- Java多线程案例之定时器详解 2023-06-17
- 详解Nacos中注册中心和配置中心的实现 2023-05-08