应届日记之TreeUtiles工具类的使用

2023-11-06

今天遇到一个问题,需要将数据库里面的省市查出来,返回给前端树形结构。用到了TreeUtiles工具类。


/**
 * 将list组装成一棵树返回
 * @param list
 * @param primaryfieldName
 * @param parentFieldName
 * @param childrenListName
 * @return
 */
public List<T> listToTree(List<T> list, String primaryfieldName, String parentFieldName, String childrenListName){
    List<T> result = new ArrayList<>();
    //将数据封装成树形结构
    Map<Object, T> map = new HashMap<>();
    for (T obj : list) {
        Object fileId = invokeGet(obj, primaryfieldName);
        map.put(fileId, obj);
    }
    for(T obj : list) {
        Object fileParentId = invokeGet(obj, parentFieldName);
        T object = map.get(fileParentId);
        if (object != null) {
            List<T> children = (List<T>) invokeGet(object, childrenListName);
            if (ObjectUtils.isEmpty(children)) {
                children = new ArrayList<>();
            }
            children.add(obj);
            invokeSet(object, childrenListName, children);
        } else {
            result.add(obj);
        }
    }
    return result;
}

invokeGet, invokeSet这是反射的方法。工具类利用的是反射机制,完成树化。

参数:

List list 查询的数据库的数据
String primaryfieldName 对应数据库里面的主键id
String parentFieldName, 对应数据库里面的parentId
String childrenListName 子列表,使用时需要在Entity实体类中增加一个private List childList

例子:

数据库表格:primaryfieldName–>“city_id”, parentFieldName–>“parent_id”

CREATE TABLE `sys_city` (
  `city_id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '城市ID',
  `city_name` varchar(255) NOT NULL COMMENT '城市名称',
  `parent_id` bigint(11) DEFAULT NULL COMMENT '父ID',
  `level` bigint(11) DEFAULT NULL COMMENT '层级',
  PRIMARY KEY (`city_id`)
) ENGINE=InnoDB AUTO_INCREMENT=375 DEFAULT CHARSET=utf8mb4;

在这里插入图片描述
散会,biubiubiu~~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

应届日记之TreeUtiles工具类的使用 的相关文章

随机推荐