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

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

这篇文章是以构造一棵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探讨或在下边回复

时间: 2024-10-28 14:37:32

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

如何将Sql server数据库中的模型图转化到Word中--并能够查看字段的属性信息

1. 在Sql server数据库中创建数据库的模型图 -- Database Diagrams 2. 控制面板--管理工具--ODBC数据源链接--创建一个Sql server的数据源链接 3. 打开Visio工具,打开数据库模型--Database--Reverse Engineer[反向工程] 选择要导入到Visio中的表: 4. 将DB的表结构导入到Visio中,界面可能需要略微调整一下 可以在Visio中查看字段的详细信息 将Visio保存成一个文件. 5.打开Word,插入对象 将V

从数据库中导出excel报表

通常需要将后台数据库中的数据集或者是其他列表等导出excel 报表,这里主要引用了Apose.cells dll 类库, (1)直接上主要代码: protected void txtExport_Click(object sender, EventArgs e)         { try             { // 获取测试商品报表 IList<ProductEntity> pList = ProductBLL.getProductList(); // 导出到Excel中 Workbo

ASP.NET中让图片以二进制的形式存储在数据库中

今早有个网友问到我这问题,以前我都是直接在数据库中存文件名的,还没有试过存储整张图片到数据库中,上网搜索了一下,自己又测试了一番,代码如下:建立保存图片的表的SQL语句: Sql代码   USE [niunantest] GO /****** 对象:  Table [dbo].[picdata]    脚本日期: 03/30/2010 14:51:58 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [d

数据库中读取出0或1,页面显示禁用或正常

数据库中存字段比如: 性别:男1.女0 状态:正常1 禁用0 权限:管理员0 普通用户1 如何读取出来后,在JSP页面显示中文意思,这里要用到朝EL表达式的三目运算,与JAVA的三目运用一样 <td>${user.role eq 0?"管理员":"普通用户" }</td> <td>${user.status eq 0?"禁用":"正常" }</td>

oracle存储过程---获取数据库中到指定经纬度距离的坐标

新项目需求: 结合百度地图,在地图中指定一个地点,获取此地点周围1km范围内所有数据库中存的单位的地点和信息标记在地图上.于是初写了一把oracle的存储过程,纯靠摸索写的. 后台需要的函数如下: 首先,计算圆弧函数 CREATE OR REPLACE FUNCTION RAD(d number) RETURN NUMBER is PI number :=3.141592625; begin return  d* PI/180.0; end ; 然后,计算距离函数 CREATE OR REPLA

前台传来的新数据与数据库中的旧数据比较更新算法

工作中遇到一个很小的功能,发现写好还有点难度,经过一晚上的思考,把成果记录下. 问题: 数据库中保存了一些数据,前台更新操作传来新的数据.如何比较差异,进行更新.如: 前台传来1,2,3,数据库中有3,5.则需要在数据库中增加1,2:在数据库中删除5:原有数据3不变. 解决方法一: 先把数据库中原的数据全部清空,然后把前台的数据全部执行插入. 这种方法简单,很容易理解,以及判断及正确性.缺点是如果原数据库数据较多,则重复删除后增加,则效率不高. 解决方法二: 查询原数据库中的数据,做为待删除的列

java将数据库中菜单表中内容转化成一个导航树

数据库中字段: menuId   parentMenuId    menuName   link等 首先我们肯定是将所有的菜单从数据库中查到一个List中,下面我们需要对这个数组进行处理,将这个list转化成树的格式 原来的时候处理都很麻烦,需要去做递归操作,类似这种思路 1.找到根菜单 2.根据根菜单的id去查找整个数组中parentId为这个id的对象,放到list中 3.对于根组件的子菜单进行2操作,知道找不到子菜单为止 这样的话需要每次都需要从整个数组中查找,不管某一个是否已经经过处理了

C#将图片存放到SQL SERVER数据库中的方法

本文实例讲述了C#将图片存放到SQL SERVER数据库中的方法.分享给大家供大家参考.具体如下: 第一步: //获取当前选择的图片 this.pictureBox1.Image = Image.FromStream(this.openFileDialog1.OpenFile()); //获取当前图片的路径 string path = openFileDialog1.FileName.ToString(); //将制定路径的图片添加到FileStream类中 FileStream fs = ne

B+树在数据库中的应用

B+树在数据库中的应用 flyfish 2015-7-6 B+树在数据库中的应用重要是实现索引 应用方式一 ID为表的主键,利用主键建立一棵B+树 叶子结点存储记录的地址 应用方式二 ID为表的主键,建立一棵B+树 叶子结点存储了整条记录 版权声明:本文为博主原创文章,未经博主允许不得转载.