处理一个集合中的数据以父子形式展现

1大家在开发的时候,前端处理父子处理存在级联关系的下拉框,或者展示数据时以父子形式展示,如果级联的数据比较多,处理起来效率不高,还比较麻烦,

如果后端在返回list数据时,能够将父子关系处理好返回,这样前端处理起来就简单,开发效率也就高了。

2所以搞了一个小工具,直接上源码,如果看不懂可以自己去检验一下就明白原理了。

//model实体
public class SysOrg implements Serializable {
  /**
   * 
   */
  private static final long serialVersionUID = 9133631499822051115L;
  private Long id; 
  private Long pid;
  private String orgName;
  public Long getId() {
    return id;
  }
  public void setId(Long id) {
    this.id = id;
  }
  public Long getPid() {
    return pid;
  }
  public void setPid(Long pid) {
    this.pid = pid;
  }
  public String getOrgName() {
    return orgName;
  }
  public void setOrgName(String orgName) {
    this.orgName = orgName;
  }
}
//构建的下拉菜单model
public class DropdownItem implements Serializable {

  /**
   * 
   */
  private static final long serialVersionUID = -631110845195677461L;
  /**
   * 显示标签
   */
  private String label;
  /**
   * 选中值
   */
  private Object value;
  /**
   * 子项
   */
  private List<DropdownItem> children = new ArrayList<DropdownItem>();
  public String getLabel() {
    return label;
  }
  public void setLabel(String label) {
    this.label = label;
  }
  public Object getValue() {
    return value;
  }
  public void setValue(Object value) {
    this.value = value;
  }
  public List<DropdownItem> getChildren() {
    return children;
  }
  public void setChildren(List<DropdownItem> children) {
    this.children = children;
  }
}
/**
 * 下拉数据构建工具,将查询到的list转换成下拉数据的工具类,只需要传入list,设置labelField,valueField,parentField可选
 *
 */
public class DropdownBuilder {
  /**
   * 下拉数据
   */
  @SuppressWarnings("rawtypes")
  private List list;
  /**
   * 内容字段
   */
  private String labelField;
  /**
   * 值字段
   */
  private String valueField;
  /**
   * 构建子项字段
   */
  private String parentField;

  private DropdownBuilder() {}

  public static DropdownBuilder create() {
    return new DropdownBuilder();
  }

  @SuppressWarnings("rawtypes")
  public DropdownBuilder setList(List list) {
    this.list = list;
    return this;
  }

  public DropdownBuilder setLabelField(String labelField) {
    this.labelField = labelField;
    return this;
  }

  public DropdownBuilder setValueField(String valueField) {
    this.valueField = valueField;
    return this;
  }

  public DropdownBuilder setParentField(String parentField) {
    this.parentField = parentField;
    return this;
  }

  /**
   * 构建下拉菜单数据
   * 
   * @return
   */
  public List<DropdownItem> build() {
    if (CollectionUtils.isEmpty(list)) {
      return Collections.emptyList();
    }
    List<DropdownItem> rtnList = new ArrayList<DropdownItem>();
    try {
      Map<String, DropdownItem> map = new HashMap<String, DropdownItem>();
      for (Object obj : list) {
        String label = BeanUtils.getProperty(obj, labelField);//根据定义的lableFiled(比如id)取sysorg对象中id值作为DropdownItem中的labe
        if (StringUtils.isEmpty(label)) {
          //ExceptionUtils.wrapBusiException("{}标签值不能为空", labelField);
        }
        String value = BeanUtils.getProperty(obj, valueField);//取orgName属性值作为DropdownItem中的value值
        if (StringUtils.isEmpty(value)) {
          //ExceptionUtils.wrapBusiException("{}值不能为空", valueField);
        }
        String parent = null;
        if (StringUtils.isNotEmpty(parentField)) {
          parent = BeanUtils.getProperty(obj, parentField);
        }
        DropdownItem item = new DropdownItem();
        item.setLabel(label);
        item.setValue(value);
        map.put(value, item);
        if (StringUtils.isNotEmpty(parent)) {
          DropdownItem parentItem = map.get(parent);
          if (parentItem != null) {
            parentItem.getChildren().add(item);
          } else {
            rtnList.add(item);
          }
        } else {
          rtnList.add(item);
        }
      }
    } catch (Exception e) {
      //ExceptionUtils.marshException(ICommonResponse.FAIL_CODE, "获取下拉属性错误", e);
    }
    return rtnList;
  }
}

public static void main(String[] args) {
    List<SysOrg> list = new ArrayList<SysOrg>();
    SysOrg org1 = new SysOrg();
    org1.setId(1L);
    org1.setOrgName("测试1");
    org1.setPid(0L);
    list.add(org1);
    
    SysOrg org2 = new SysOrg();
    org2.setId(2L);
    org2.setOrgName("测试2");
    org2.setPid(1L);
    list.add(org2);
    
    SysOrg org3 = new SysOrg();
    org3.setId(3L);
    org3.setOrgName("测试3");
    org3.setPid(0L);
    list.add(org3);
    
    SysOrg org4 = new SysOrg();
    org4.setId(4L);
    org4.setOrgName("测试4");
    org4.setPid(2L);
    list.add(org4);
    
    List<DropdownItem> ddl = DropdownBuilder.create().setList(list).setLabelField("orgName").setValueField("id").setParentField("	pid").build();
    System.out.print(JSON.toJSONString(ddl, true));
  }

3测试结果



4看结果是不是很清晰明了,可以自己测试一下,原理其就明白了了微笑


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在MySQL实现数据父子关系,可以使用树形结构来组织数据,常见的有两种方式:嵌套集合模型和闭包表模型。 嵌套集合模型是一种将树形结构的数据嵌套在一起的方式,其每个节点都有一个左右值,用于表示它在树形结构的位置。这种模型可以使用递归查询来获取整个树形结构,但是修改树形结构时会涉及到大量的更新操作,性能较低。 闭包表模型则是使用一个专门的表来存储节点之间的关系,其每个记录都表示一个父子关系。这种模型可以使用更少的查询操作获取整个树形结构,但是在插入或删除节点时需要维护大量的关系记录。 以下是一个使用嵌套集合模型实现的示例: ```sql CREATE TABLE category ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, lft INT NOT NULL, rgt INT NOT NULL ); -- 插入根节点 INSERT INTO category (name, lft, rgt) VALUES ('Root', 1, 2); -- 插入子节点 INSERT INTO category (name, lft, rgt) VALUES ('Child 1', 2, 3); INSERT INTO category (name, lft, rgt) VALUES ('Child 2', 4, 5); -- 查询整个树形结构 SELECT * FROM category ORDER BY lft; ``` 以上示例,根节点的左右值为1和2,子节点1的左右值为2和3,子节点2的左右值为4和5。查询整个树形结构时,使用ORDER BY lft对结果进行排序即可。 需要注意的是,嵌套集合模型在修改树形结构时需要使用大量的更新操作,性能较低。在实际使用时,可以根据具体情况选择合适的模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值