利用java+mysql递归实现拼接树形JSON列表的方法示例

下面是关于使用Java和MySQL递归生成树形JSON列表的攻略。

下面是关于使用Java和MySQL递归生成树形JSON列表的攻略。

核心思路

树形结构实际上是一种递归结构,我们可以利用递归的思想来实现树形结构的生成。具体步骤如下:

  1. 从数据库中查询出所有的节点,包括节点的id、pid、name等信息;
  2. 创建根节点,将根节点放入节点列表中;
  3. 遍历节点列表,如果该节点的pid等于根节点的id,将该节点加入根节点的子节点中;
  4. 递归遍历该节点的子节点列表,加入子节点的子节点等,直到该节点的子节点为空为止;
  5. 将根节点转换为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列表的方法示例

基础教程推荐