Create a table with following entries:
CREATE TABLE MENU (ID INTEGER, NAME VARCHAR(100), PARENT INTEGER);
INSERT INTO MENU VALUES(2,'COMPUTER',NULL);
INSERT INTO MENU VALUES(3,'PRINTER',NULL);
INSERT INTO MENU VALUES(4,'NOTEBOOK',2);
INSERT INTO MENU VALUES(5,'DESKTOP',2);
INSERT INTO MENU VALUES(6,'DELL',4);
INSERT INTO MENU VALUES(7,'LENOVA',4);
INSERT INTO MENU VALUES(8,'CANON',3);
INSERT INTO MENU VALUES(9,'HP',3);
INSERT INTO MENU VALUES(10,'SERVER',2);
INSERT INTO MENU VALUES(11,'DELL',10);
INSERT INTO MENU VALUES(12,'POWEREDGE',11);
Following class reads the above data from database and outputs left menu data in JSON format:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.google.gson.Gson;
public class RecurseMenu {
private static final String DRIVER = "org.hsqldb.jdbcDriver";
private static final String URL =
"jdbc:hsqldb:file:D:/hsqldb/data/hsqldb/cameldb;shutdown=true";
public void process() {
try {
Connection conn =
DriverManager.getConnection(URL, "camel", "camel");
Statement stmt = conn.createStatement();
List<Item> data = new ArrayList<Item>();
String qry = getSQL();
ResultSet rs = stmt.executeQuery(qry);
while (rs.next()) {
Integer id = rs.getInt("ID");
Integer parent = rs.getInt("PARENT");
String title = rs.getString("TITLE");
Item item = new Item();
item.setId(id);
item.setParent(parent);
item.setTitle(title);
data.add(item);
}
List tempList = new ArrayList ();
recurseChildren( data, tempList, null);
data.removeAll(tempList);
Gson gson = new Gson();
String json = gson.toJson(data);
System.out.println(json);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void recurseChildren( List<Item> items, List tempList, Item newItem) {
for (Item item : items) {
if (newItem != null){
if(newItem.getParent() == item.getId()) {
item.getChildren().add(newItem);
item.setFolder(true);
tempList.add(newItem);
break;
}else continue;
}
if(newItem == null )
recurseChildren( items, tempList, item);
}
}
private String getSQL() {
StringBuffer sb = new StringBuffer();
sb.append(" SELECT ID, Parent, Name AS Title ");
sb.append(" FROM Menu ");
sb.append(" ORDER BY ID ASC ");
return sb.toString();
}
public static void main(String[] args) {
RecurseMenu obj = new RecurseMenu();
obj.process();
}
}
The Item bean:
import java.util.*;
public class Item {
private int id;
private boolean folder;
private int parent;
private String title;
private Set<Item> children = new HashSet<Item>();
public Set<Item> getChildren() {
return children;
}
public boolean getFolder(){
return folder;
}
public void setFolder(boolean folder){
this.folder = folder;
}
public String getTitle(){
return title;
}
public void setTitle(String title){
this.title = title;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getParent() {
return parent;
}
public void setParent(int parent) {
this.parent = parent;
}
}
The JSON output will be as follows:
[{"id":2,"folder":true,"parent":0,"title":"COMPUTER","children":[{"id":5,"folder":false,"parent":2,"title":"DESKTOP","children":[]},{"id":4,"folder":true,"parent":2,"title":"NOTEBOOK","children":[{"id":6,"folder":false,"parent":4,"title":"DELL","children":[]},{"id":7,"folder":false,"parent":4,"title":"LENOVA","children":[]}]},{"id":10,"folder":true,"parent":2,"title":"SERVER","children":[{"id":11,"folder":true,"parent":10,"title":"HP","children":[{"id":12,"folder":false,"parent":11,"title":"POWEREDGE","children":[]}]}]}]},{"id":3,"folder":true,"parent":0,"title":"PRINTER","children":[{"id":8,"folder":false,"parent":3,"title":"CANON","children":[]},{"id":9,"folder":false,"parent":3,"title":"HP","children":[]}]}]