今天遇到一个问题,需要将数据库里面的省市查出来,返回给前端树形结构。用到了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~~~