将平铺数据处理成层级数据的疑问
问题描述:
问题中使用的如下代码:
@WebServlet("/api/user_info")
public class UserInfoServlet extends HttpServlet {
private RbacService rbacService = new RbacService();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String uid = request.getParameter("uid");
List<Node> nodes = rbacService.selectNodeByUserId(Long.parseLong(uid));
List<Map> treeList = new ArrayList<>();
Map module = null;
for (Node node : nodes) {
if (node.getNodeType() == 1){
module = new LinkedHashMap();
module.put("node", node);
module.put("children", new ArrayList<>());
treeList.add(module);
} else if (node.getNodeType() == 2) {
List children = (List) module.get("children");
children.add(node);
}
}
String json = new ResponseUtils().put("nodeList", treeList).toJsonString();
response.setContentType("application/json;charset=utf-8");
response.getWriter().println(json);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}对数据进行处理需要原本的数据严格的按照模块,功能,功能,功能的顺序进行排列。如果在未来加功能,就会造成混乱。比如模块一的功能添加在模块五的后面。所以这样子处理数据应该不太适用通用场合吧?
尝试过的解决方式:
不过我对这个知识点的理解是这样的:
这里的弊端就是要求数据库中的模块和功能是按顺序排列的。模块后面接着是相关的功能。不过思想上就是将数据弄出上下级结构,这里的LinkedHashMap搭配ArrayList就是核心的思想。把ArrayList放进LinkedHashMap就形成了次一级的结构,也就是在LinkedHashMap的非集合数据是一级,在其中的集合数据自然就成了二级。一个模块对应一个LinkedHashMap,一个LinkedHashMap中存放一个模块信息以及一个ArrayList,这个ArrayList用来存放模块下的功能。
最后我们可以把整理好的模块放入一个List<Map>中进行保存,方便一次性进行json序列化,然后把数据传输给View层。
我的理解是否有误?
正在回答
同学你好,同学的理解是正确的。
1.课程中的数据库设计本身是有一点问题的,实际开发的时候并不会这么处理。这里只是为了演示一种特殊情况的处理方式,即在数据库设计时没有按照层级进行设计,而是后期通过主键进行处理。实际上,多数情况下数据库会在设计时考虑到这点,会在字段上加上例如父节点id这样的字段来进行处理。
2.上一条中父节点的案例在学习MySql的时候处理过,只不过当时只关注sql语句而不是业务逻辑,例如工资值和工资等级。
如果这里也是按照父子节点进行处理,就不需要使用这种方式了,可以通过表关联查询,然后在代码中判断父节点id值,然后生成集合就可以了。
祝学习愉快~
- 参与学习 人
- 提交作业 8788 份
- 解答问题 9886 个
综合就业常年第一,编程排行常年霸榜,北上广深月薪过万! 不需要基础,无需脱产即可学习,只要你有梦想,想高薪! 全新升级:技术栈升级(包含VUE3.0,ES6,Git)+项目升级(前后端联调与功能升级)
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星