问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何将数据库中数据转化成树形结构

发布网友 发布时间:2022-04-24 17:16

我来回答

2个回答

懂视网 时间:2022-04-07 23:02

很多时候,我们会把一棵树存放到数据库中,当前台需要展示一个树形列表时,将这棵树读取出来并显示,这个过程是怎么实现的呢?

这篇文章是以构造一棵easyui前台框架的一个树形列表为例,后台框架是spring MVC+JPA。

首先看一下数据库中这颗树是怎么存的:

技术分享

树的结构一目了然,这是一棵表示部门的树。

下面是实体类:

/**
 * 部门类 用户所属部门(这里的部门是一个相对抽象的词)
 * 使用前缀编码,每级增加三个数字,如:第一级 001,第二级001001,第三级001001001
 * @author Administrator
 *
 */
@Entity
public class Department {
 
	private String id;  //部门id 
	private String pid;  //父id
	private String text; //部门名称
	private List<Department> children; //用于存储子节点
	@Id
	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 getText() {
		return text;
	}
	public void setText(String text) {
		this.text = text;
	}
	@OneToMany
	public List<Department> getChildren() {
		return children;
	}
	public void setChildren(List<Department> children) {
		this.children = children;
	} 
	
}
由于使用的是easyui ,为了树可以正确显示,必须包含属性id和text。

下面是控制类,用于读取数据库中的数据,生成一个List,该list返回到前台时会转成json格式的数据,重点需要理解的就是getTree()和buildTree()这两个方法,通过递归生成这棵树,基本实现原理是遍历树的某一层,获取每个节点的子节点们(一个list),然后将它作为父节点的一个属性set进去

@Controller
@RequestMapping("/department")
public class DepartmentController {

	private static final String DEPARTEMNTMANAGE = "module/jsp/system/departmentManage.jsp";
	
	@Resource(name="departmentServiceImpl")
	private DepartmentService departmentService;
	/**
	 * 获取部门管理页面.
	 * @return
	 */
	@RequestMapping("/getPage.do") 
	public String getUserManagePage(){
		return DEPARTEMNTMANAGE;
	}
	
	/**
	 * 获取部门树形列表
	 */
	@RequestMapping(value = "/getTree.do", method = RequestMethod.POST)
	@ResponseBody //此注解表明返回值跳过视图处理部分,直接写入 http response body中
	public List<Department> getTree(){
		List<Department> root = departmentService.findById("0"); //获取根节点(获取的值存到list中)
		net.sf.json.JSONArray jsonArray = net.sf.json.JSONArray.fromObject(buildTree(root));
		System.out.println(jsonArray.toString());

		return buildTree(root);
	}
 public List<Department> buildTree(List<Department> root){
 	for(int i=0;i<root.size();i++){
			List<Department> children = departmentService.findByPid(root.get(i).getId()); //查询某节点的子节点(获取的是list)
			buildTree(children);	
			root.get(i).setChildren(children);
		}
 	return root;
 }
 
}
这里用查询的方法findById和findByPid是基于spring data JPA的方法,下面是相关类:

public interface DepartmentDao extends Repository<Department, Integer>{
 public List<Department> findByPid(String pid);
 public List<Department> findById(String id);
}

public interface DepartmentService {
	public List<Department> findByPid(String pid);
 public List<Department> findById(String id);
}

@Service("departmentServiceImpl")
public class DepartmentServiceImpl implements DepartmentService{

	@Autowired
	private DepartmentDao departmentDao;
	
	@Override
	public List<Department> findByPid(String pid) {	
		return departmentDao.findByPid(pid);
	}

	@Override
	public List<Department> findById(String id) {
		return departmentDao.findById(id);
	}

}

前台调用如下:

 $(function(){
 $('#tt').tree({ 
		 url: 'department/getTree.do', 
		 loadFilter: function(data){ 
				if (data.d){ 
		  return data.d; 
		 } else { 
		  return data; 
		 } 
		 } 
	 }); 
 });
这是后台返回给前台一个如下的json格式的数据:

[
 {
 "children": [
  {
  "children": [
   {
   "children": [],
   "id": "001001",
   "pid": "001",
   "text": "部门一"
   },
   {
   "children": [],
   "id": "001002",
   "pid": "001",
   "text": "部门二"
   }
  ],
  "id": "001",
  "pid": "0",
  "text": "一分公司"
  },
  {
  "children": [
   {
   "children": [],
   "id": "002001",
   "pid": "002",
   "text": "部门一"
   },
   {
   "children": [],
   "id": "002002",
   "pid": "002",
   "text": "部门二"
   }
  ],
  "id": "002",
  "pid": "0",
  "text": "二分公司"
  },
  {
  "children": [],
  "id": "003",
  "pid": "0",
  "text": "三分公司"
  }
 ],
 "id": "0",
 "pid": "-1",
 "text": "总公司"
 }
]

在页面上如下显示:

技术分享
大致就是这样实现的,如果觉得小编写的不明白可以加Q探讨或在下边回复


如何将数据库中存的树转化为树形列表(以easyui的tree为例)

标签:

热心网友 时间:2022-04-07 20:10

用递归或外部程序组织循环,具体跟你的数据库表结构有关
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
南南京到许昌的公共汽车票 南京去句容需要多久 南京到单县汽车票多少钱 八月十一号南京到高密的汽车票提前几天买 外省保育员证在广东能领到补贴吗 外省的保育员资格证可以在深圳申请补贴吗 广州保育员证在深圳可以申请从教津贴吗 广州的保育师证能在深圳用吗 很走心的干净短句,具有治愈能力的句子 社会很现实的哲理句子太经典了 求一个二维数组转结构树的高效算法,C# 急急急!!!怎样将json数组数据 转成json树结构数据? 怎么将数据库中存的树转化为树形列表 怎样把一个数组转化成二叉树? 数组集合如何转换成树形 五年级小数除法口算题 五年级小数除法试卷 给女生送什么礼物? 小学五年级小数乘除法口算1000题 权志龙是唯一有的人 但是到底是什么意思 女生送给女生该送什么花? 五年级小数乘、除法计算题、应用题各20道。 五年级小数乘除法笔算题 权志龙是唯一有的人 但是到底是什么意思 送女生什么礼物好,要有意义的。 五年级口算题(小数乘除法) 杜松子酒怎么做的?它有什么功效? 请给80道带答案的五年级乘除法小数口算题,我急用! 酒吧什么酒好喝 5年级小数除法计算题 求助,php递归里面使用静态变量保存数组,怎么处理成树形结构? js中如何将json数组转换为tree结构对象 grasshopper怎么把列表数据转化为树形数据 如何用Java实现树形结构啊? 清明节主题班会~急~啊 请教如何将php数组以树形结构输出到页面 如何搞一个有关清明节的主题班会~我要详细的策划~! C# 怎么讲数据库字段转换为树状结构(treeview)呢? 清明节有什么活动? php输出数组为树形结构,处理末端子目录出现问题,求教~ 数据结构,树形结构问题。 2021深圳清明节有哪些免费活动 深圳清明节活动盘点 求反转PHP数组树形结构 怎么把Json数据转成Json树状结构 数据结构怎么又分为集合,线性结构,树形结构,图状结构,然后又分为逻辑结构,储存结构,对数据的操作? java实现对树形结构(文件夹式)数据数组进行排序 Matlab 如何实现树结构 2020年云南省临沧市事业单位招聘条件是什么? 临沧事业单位招聘2020岗位表可以在哪里查看? 临沧市2020年事业单位招聘特殊教育社会工作岗位到现在有多少人报名了?