java实现树状数据

sql

		CREATE TABLE `OT_MAIL_LIST_GROUP` (
`FLOW_ID`  varchar(32) NOT NULL COMMENT '主键' ,
`GROUP_NAME`  varchar(32) NOT NULL COMMENT '分组名' ,
`PARENT_ID`  varchar(32) NOT NULL COMMENT '父级组' ,
`CREATE_USER_ID`  varchar(32) NOT NULL COMMENT '创建中ID' ,
`CREATE_TIME`  datetime NULL COMMENT '创建时间' ,
`MODIFY_USER_ID`  varchar(36) NULL COMMENT '修改者ID' ,
`MODIFY_TIME`  datetime NULL COMMENT '修改时间' ,
`LHD`  int NOT NULL COMMENT '左ID,方便查询数据' ,
`RHD`  int NOT NULL COMMENT '右ID,方便查询数据',
PRIMARY KEY (`FLOW_ID`) 
)
;

数据库实体类

package com.cdsf.egov.oa.maillist.domain;

import java.util.Date;

/**
 * 通讯录分组表
 * @author tanbowei
 *
 */
public class MListGroup {

	/**主键*/
	private String flowId;
	/**分组名字*/
	private String groupName;
	/**父级ID*/
	private String parentId;
	/**用户ID*/
	private String createUserId;
	/**创建时间*/
	private Date createTime;
	/**修改者ID*/
	private String modifyUserId;
	/**修改时间*/
	private Date modifyTime;
	/**左ID*/
	private int LHD;
	/**右ID*/
	private int RHD;
	public String getFlowId() {
		return flowId;
	}
	public void setFlowId(String flowId) {
		this.flowId = flowId;
	}
	public String getGroupName() {
		return groupName;
	}
	public void setGroupName(String groupName) {
		this.groupName = groupName;
	}
	public String getParentId() {
		return parentId;
	}
	public void setParentId(String parentId) {
		this.parentId = parentId;
	}
	
	public String getCreateUserId() {
		return createUserId;
	}
	public void setCreateUserId(String createUserId) {
		this.createUserId = createUserId;
	}
	public Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
	public String getModifyUserId() {
		return modifyUserId;
	}
	public void setModifyUserId(String modifyUserId) {
		this.modifyUserId = modifyUserId;
	}
	public Date getModifyTime() {
		return modifyTime;
	}
	public void setModifyTime(Date modifyTime) {
		this.modifyTime = modifyTime;
	}
	public int getLHD() {
		return LHD;
	}
	public void setLHD(int lHD) {
		LHD = lHD;
	}
	public int getRHD() {
		return RHD;
	}
	public void setRHD(int rHD) {
		RHD = rHD;
	}
	
	
}



树形数据封装类

package com.cdsf.egov.oa.maillist.domain;

import java.util.List;

public class TreeMList {

	
	/**分组ID*/
	private String id;
	/**分组名字*/
	private String text;
	/**父级ID*/
	private String parentId;
	/**子集合*/
	private List<TreeMList> childrenList;
	/**是否拥有子集合*/
	private boolean hasChildren;
	
	/**子集合类型*/
	private int type =1;
	public int getType() {
		return type;
	}
	public void setType(int type) {
		this.type = type;
	}
	public boolean isHasChildren() {
		return hasChildren;
	}
	public void setHasChildren(boolean hasChildren) {
		this.hasChildren = hasChildren;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	
	public String getText() {
		return text;
	}
	public void setText(String text) {
		this.text = text;
	}
	public String getParentId() {
		return parentId;
	}
	public void setParentId(String parentId) {
		this.parentId = parentId;
	}
	public List<TreeMList> getChildrenList() {
		return childrenList;
	}
	public void setChildrenList(List<TreeMList> childrenList) {
		this.childrenList = childrenList;
	}	
}
实现方案1

此方案是通过每次用户传入的节点ID来实现树状,每次查询只查询当前传入ID的子节点

public List<?> listGroup(Map<String, String> map) {
		MListGroup mg = new MListGroup();//要实现树的分组数据
		mg.setCreateUserId(currentUser().id().toString());//设置当前用户的ID
		if(map.get("id")!=null){//判断是否有接收参数(参数为选中的树节点ID)
			mg.setFlowId(map.get("id"));将父节点ID作为子节点的父ID来查询
		}else{
			mg.setFlowId(currentUser().id().toString());本系统默认用当前用户的id作为一级根节点的ID
		}
		if(!s_Parent(mg)){//判断是否拥有子分组
			addGroup_s();//为没有分组的用户添加默认分组
		}
		List<MListGroup> list = (List<MListGroup>) lMapper.listGroup(mg);//接收数据层查询出来的数据
		List<TreeMList> lm = new ArrayList<TreeMList>();
		TreeMList tm1 = new TreeMList();
		for (MListGroup mg1 : list) {
			TreeMList tm = new TreeMList();
			tm.setText(mg1.getGroupName());
			tm.setId(mg1.getFlowId());
			tm.setParentId(mg1.getParentId());
			tm.setHasChildren(s_Parent(mg1));
			lm.add(tm);
		}
		tm1.setChildrenList(lm);
		return tm1.getChildrenList();
	}
/**
     * 为没有分组的用户添加默认分组
     */
    public void addGroup_s(){
        MListGroup mg = new MListGroup();
        mg.setFlowId(Tools.createUUID());
        mg.setParentId(currentUser().id().toString());
        mg.setGroupName("我的通讯录");
        mg.setLHD(1);
        mg.setRHD(2);
        mg.setCreateTime(new Date());
        mg.setCreateUserId(currentUser().id().toString());
        mg.setModifyTime(new Date());
        mg.setModifyUserId(currentUser().id().toString());
        lMapper.addGroup(mg);
    }<p>
</p>/**
     * 判断是否拥有子分组
     * @param mg
     * @return
     */
    public boolean s_Parent(MListGroup mg){
        return lMapper.s_Parent(mg)>0?true:false;
    }


方案2

此方案实现原理 为 一次性将所有的树都查询出来,没有二次查询

@Override
	public List<?> listGroup(Map<String, String> map) {
		MListGroup mg = new MListGroup();
		mg.setCreateUserId(currentUser().id().toString());
		if(map.get("id")!=null){
			mg.setFlowId(map.get("id"));
		}else{
			mg.setFlowId(currentUser().id().toString());
		}
		if(!s_Parent(mg)){
			addGroup_s();
		}
		List<MListGroup> list = (List<MListGroup>) lMapper.listGroup(mg);
		List<TreeMList> lm = new ArrayList<TreeMList>();
		TreeMList tm1 = new TreeMList();
		for (MListGroup mg1 : list) {
			TreeMList tm = new TreeMList();
			tm.setText(mg1.getGroupName());
			tm.setId(mg1.getFlowId());
			tm.setParentId(mg1.getParentId());
			tm.setHasChildren(s_Parent(mg1));
			tm.setChildrenList(treeGroup(mg1));//调用递归方法
			lm.add(tm);
		}
		tm1.setChildrenList(lm);
		return tm1.getChildrenList();
	}
	
	/**
	 * 为没有分组的用户添加默认分组
	 */
	public void addGroup_s(){
		MListGroup mg = new MListGroup();
		mg.setFlowId(Tools.createUUID());
		mg.setParentId(currentUser().id().toString());
		mg.setGroupName("我的通讯录");
		mg.setLHD(1);
		mg.setRHD(2);
		mg.setCreateTime(new Date());
		mg.setCreateUserId(currentUser().id().toString());
		mg.setModifyTime(new Date());
		mg.setModifyUserId(currentUser().id().toString());
		lMapper.addGroup(mg);
		
//		lMapper.addGroup(mg);
	}
	
	/**
	 * 递归所有的分组
	 * @param mg
	 * @return
	 */
	public List<TreeMList> treeGroup(MListGroup mg){
		List<MListGroup> list = (List<MListGroup>) lMapper.listGroup(mg);//接收数据层查询出来的数据
		List<TreeMList> lm = new ArrayList<TreeMList>();
		for (MListGroup mg1 : list) {
			TreeMList tm = new TreeMList();
			List<TreeMList> tm2 =new ArrayList<TreeMList>();
			tm.setText(mg1.getGroupName());
			tm.setId(mg1.getFlowId());
			tm.setParentId(mg1.getParentId());
			tm.setHasChildren(s_Parent(mg1));
			if(s_Parent(mg1)){//如果循环到的节点拥有子节点,继续调用当前方法递归
				tm2 = treeGroup(mg1);	
			}
			tm.setChildrenList(tm2);
			lm.add(tm);
		}
		return lm;
	}


	
	/**
	 * 判断是否拥有子分组
	 * @param mg
	 * @return
	 */
	public boolean s_Parent(MListGroup mg){
		return lMapper.s_Parent(mg)>0?true:false;
	}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值