多级树形目录mysql的使用_利用java+mysql递归实现拼接树形JSON列表的方法示例

前言

本文给大家介绍的是关于利用java+mysql递归实现拼接树形JSON列表的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍:

我们在做Java web项目时,前端控件例如国家-省-市-区-县等树形列表,常常需要多级树形json数据

例如:

[

{

"name": "商品目录",

"pid": "-1",

"id": "1",

"children": [

{

"name": "日用品",

"pid": "1",

"id": "11",

"children": [

{

"name": "洗发水",

"pid": "11",

"id": "111",

"children": [

{

"name": "霸王",

"pid": "111",

"id": "1111",

"children": []

}

]

}

]

},

{

"name": "食品",

"pid": "1",

"id": "12",

"children": []

}

]

}

]

整体思路分为两步,第一步获取目录及其所有子目录,获取后的列表形式如下:

[

{"id":"1","pid":"-1","name":"商品目录"},

{"id":"11","pid":"1","name":"日用品"},

{"id":"12","pid":"1","name":"食品"},

{"id":"111","pid":"11","name":"洗发水"},

{"id":"1111","pid":"111","name":"霸王"}

]

第二步,利用递归思想拼装该数据,拼装方法的工具类如下:

package *.*.*;

import net.sf.json.JSONArray;

import java.util.ArrayList;

import java.util.List;

/**

* 构造目录JSON树

* Created by fukang on 2017/5/26 0026.

*/

public class TreeBuilder {

List nodes = new ArrayList<>();

public String buildTree(List nodes) {

TreeBuilder treeBuilder = new TreeBuilder(nodes);

return treeBuilder.buildJSONTree();

}

public TreeBuilder() {

}

public TreeBuilder(List nodes) {

super();

this.nodes = nodes;

}

// 构建JSON树形结构

public String buildJSONTree() {

List nodeTree = buildTree();

JSONArray jsonArray = JSONArray.fromObject(nodeTree);

return jsonArray.toString();

}

// 构建树形结构

public List buildTree() {

List treeNodes = new ArrayList<>();

List rootNodes = getRootNodes();

for (Node rootNode : rootNodes) {

buildChildNodes(rootNode);

treeNodes.add(rootNode);

}

return treeNodes;

}

// 递归子节点

public void buildChildNodes(Node node) {

List children = getChildNodes(node);

if (!children.isEmpty()) {

for (Node child : children) {

buildChildNodes(child);

}

node.setChildren(children);

}

}

// 获取父节点下所有的子节点

public List getChildNodes(Node pnode) {

List childNodes = new ArrayList<>();

for (Node n : nodes) {

if (pnode.getId().equals(n.getPid())) {

childNodes.add(n);

}

}

return childNodes;

}

// 判断是否为根节点

public boolean rootNode(Node node) {

boolean isRootNode = true;

for (Node n : nodes) {

if (node.getPid().equals(n.getId())) {

isRootNode = false;

break;

}

}

return isRootNode;

}

// 获取集合中所有的根节点

public List getRootNodes() {

List rootNodes = new ArrayList<>();

for (Node n : nodes) {

if (rootNode(n)) {

rootNodes.add(n);

}

}

return rootNodes;

}

public static class Node {

private String id;

private String pid;

private String name;

private List children;

public Node() {

}

public Node(String id, String pid, String name) {

super();

this.id = id;

this.pid = pid;

this.name = name;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getPid() {

return pid;

}

public void setPid(String pid) {

this.pid = pid;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public List getChildren() {

return children;

}

public void setChildren(List children) {

this.children = children;

}

}

}

在Controller中的调用方法是:

@RequestMapping("/bulidJsonTree")

@ResponseBody

public String buildJsonTree(HttpServletRequest request) {

// 获取全部目录节点

List nodes = iGoodsDirSvc.getAllDirList();

// 拼装树形json字符串

String json = new TreeBuilder().buildTree(nodes);

return json;

}

其中iGoodsDirSvc.getAllDirList()方法需要将取到的数据转为Node类型:

String hql = "select id as id,pId as pid,name as name from Directory";

Query query = factory.getCurrentSession().createQuery(hql)

.setResultTransformer(Transformers.aliasToBean(TreeBuilder.Node.class));

return query.list();

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对聚米学院的支持。

你可能感兴趣的:(多级树形目录mysql的使用)