java实现树状数据

来源:互联网 发布:四度空间软件 编辑:程序博客网 时间:2024/05/16 04:55

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());//设置当前用户的IDif(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

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

@Overridepublic 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 0