本篇主要讲了关于一个表存放树的数据库表的查询方法:
利用JSON查询:
首先从数据库查询该表的所有信息:
public JSONArray fromatAll() {
JSONArray jsonArray = new JSONArray();
List<Map<String,Object>> regList=jdbcTemplate.queryForList("select id,name ,father_id as parentId from bas_mediservicetype");
for(Map<String,Object> map:regList){
jsonArray.add(map);
}
return jsonArray;
}
使用JSONArray对象递归遍历得到树:
public JSONArray treeMenuList(JSONArray menuList, int parentId) {
JSONArray childMenu = new JSONArray();
for (Object object : menuList) {
JSONObject jsonMenu = JSONObject.fromObject(object);
int menuId = jsonMenu.getInt("id");
int pid = jsonMenu.getInt("parentId");
if (parentId == pid) {
JSONArray c_node = treeMenuList(menuList, menuId);
jsonMenu.put("nodes", c_node);
childMenu.add(jsonMenu);
}
}
return childMenu;
}
最后调用:
JSONArray jsonArray =
costItemervice.treeMenuList(this.costItemDao.fromatAll(), 0);
利用LIst和Map对象只查询叶子节点的信息:
//costItemService中实现:
static List<Map<String,Object>> leafssList = new ArrayList<Map<String,Object>>();//该静态变量用于添加信息中的叶子节点
/**
* 通过递归得到医疗服务分类信息中的叶子节点信息
* @param basMstList
* @param parentId
* @return
*/
public List<Map<String, Object>> leafList1(List<Map<String, Object>> basMstList,
int parentId) {
List leafsList = new ArrayList<>();
for (Map<String,Object> basMstMap : basMstList) {
int menuId = Integer.parseInt(( basMstMap.get("id")).toString());
int pid = Integer.parseInt(( basMstMap.get("parentId")).toString());
if(parentId==pid){
List<Map<String, Object>> leafLis = leafList1(basMstList,menuId);
if(leafLis.isEmpty()){
leafsList.add(basMstMap);//递归后返回值到leafLis后判断该节点后续节点是否有值,据此保存后续节点为空也就是叶子节点的信息
leafssList.add(basMstMap);//保存信息到静态变量中
}
}
}
return leafsList;
}
/**
* 返回信息叶子节点的信息
*/
public List<Map<String, Object>> leafList (List<Map<String, Object>> basMstList,
int parentId){
leafList1(basMstList,parentId);
return leafssList;
}
//costItemDao中sql查询
public List<Map<String, Object>> queryBasMediservicetype() {
List<Map<String, Object>> basMstList = jdbcTemplate.queryForList("select id,name ,father_id as parentId from bas_mediservicetype");
return basMstList;
}
//调用:
costItemService.leafList(costItemDao.queryBasMediservicetype(), 1)
测试显示成功,但是刷新页面之后,再次调用该方法时leafsslist不是重新定义而是接着在后面增加数据,static改成private错误一样。
然后我在方法中增加了一条remove语句
/**
* 返回信息叶子节点的信息
*/
public List<Map<String, Object>> leafList (List<Map<String, Object>> basMstList,
int parentId){
leafssList.removeAll(leafssList);
leafList1(basMstList,parentId);
return leafssList;
}