关于树形结构查询的接口设计

news/2025/2/6 2:57:46/

在实际开发中,经常会遇到树形结构的查询,如:菜单树、公司组织机构树、地区区划树等等业务,这里写下两个接口设计方案已供日后使用。

1.表结构设计

//一般单表树形结构基本上都为以下结构:
id,name,parentId,其他业务指标
//多表树形同理,设计思路都是通过parentId关联在一起

2.树形返回类设计

@Data
public class TreeNode implements Serializable {private String id;//名称private String name;//上级idprivate String parentId;//子节点private List<TreeNode> childrens;//其他业务字段...
}

3.树形方案一:递归获取全部父子节点

	//传入需查询的根节点public List<TreeNodeNew> findTree(String node) {if(StrUtil.isEmpty(node)){node = 当前登录人所绑定的node节点}//LambdaQueryWrapper<TreeEntity>wrapper = new LambdaQueryWrapper<>();//wrapper.likeRight(TreeEntity::getId,node);//查出全部数据,这里可以优化:想办法只查询出需要的所有数据,比如51-5101-510101这种格式的结构like51就行List<TreeEntity> treeList = list(wrapper);//转为返回树形集合对象List<TreeNodeNew> trees = treeList.stream().map(op -> {TreeNodeNew tree = new TreeNodeNew();tree.setId(op.getCode());tree.setParentId(op.getParentId());tree.setName(op.getName());return tree;}).collect(Collectors.toList());//用传入的根节点做第一级,调用getChildren设置所有下属节点List<TreeNodeNew> collect = trees .stream().filter(item -> node.equals(item.getId())).map(item -> {item.setChildrenTreeNode(getChildren(item, collect1));return item;}).sorted(Comparator.comparing(TreeNodeNew::getId)).collect(Collectors.toList());return collect;}//传入父节点和所有数据节点信息集合,先查出所有父节点id为传入父节点id的下属数据,再递归set下属数据的childrensprivate static List<TreeNodeNew> getChildren(TreeNodeNew treeEntity, List<TreeNodeNew> treeEntityList) {List<TreeNodeNew> collect = treeEntityList.stream().filter(item -> treeEntity.getId().equals(item.getParentId())).map(item -> {item.setChildrenTreeNode(getChildren(item, treeEntityList));return item;}).sorted(Comparator.comparing(TreeNodeNew::getId)).collect(Collectors.toList());return collect;}

4.树形方案二:懒加载

//懒加载实现:每次传入一个根节点,只需要返回所有parentId为传入根节点的数据集合即可,前端每次拿到数据
//显示在根节点下面,点一次不同根节点请求一次,渲染一次public List<TreeEntity> findTree(String node) {LambdaQueryWrapper<TreeEntity> wrapper = new LambdaQueryWrapper<>();//当传入根节点为空时,为第一次进入,默认返回该根节点信息if(StrUtil.isEmpty(node)){wrapper.eq(TreeEntity::getId,node);}else{//否则返回所有父节点id为传入根节点id的下级信息wrapper.eq(TreeEntity::getParentId,node);}List<TreeEntity> list = list(wrapper);return list;}

5.总结:用方案一递归返回,优点是前端可以一次性拿到所有数据节点信息,相比懒加载不用点一次下级请求一次,只是第一次请求时效率慢点,可以考虑加缓存,但也要维护缓存。缺点是在数据量特别大的时候效率相当慢,如全国行政区划这种就适合用方案二懒加载形式,以时间换空间,方案一则相反。方案二优点是接口设计简单,维护容易。缺点是需要频繁请求数据来渲染页面。


http://www.ppmy.cn/news/602912.html

相关文章

mysql5.6.46安装教程_鲲鹏云-arm平台 mysql-5.6.46 安装

1&#xff0c;下载mysql-5.6.46.tar.gzboost_1_59_0.tar.gz2&#xff0c;安装依赖yum install gcc gcc-c cmake ncurses-devel bison libaio-devel libncurses-devel libopenssl-devel zlib-devel autoconf perl per-devel make openssl-devel3&#xff0c;解压tar -zxvf mysql…

python中排序英文单词怎么写_Python实现对文件进行单词划分并去重排序操作示例...

本文实例讲述了Python实现对文件进行单词划分并去重排序操作。&#xff0c;具体如下&#xff1a;文件名&#xff1a;test1.txt文件内容&#xff1a;But soft what light through yonder window breaksIt is the east and Juliet is the sunArise fair sun and kill the envious…

linux修改mysql密码sa_如何修改SA口令,数据库SA密码怎么改?

【问题现象】安装数据库的时候设置过SA口令&#xff0c;安装后不记得了&#xff1f;有没有办法可以修改数据库SA口令&#xff1f;【原因分析】各版本数据库更改SA口令的方法不一样&#xff0c;一般MSDE2000数据库安装时没有SA口令&#xff0c;SQL 2000和MSSQL2005 一般情况下会…

mysql64如何配置_win7 64位下如何安装配置mysql-winx64(安装记录)

win7 64位下如何安装配置mysql winx641.mysql下载官方网站下载地址&#xff1a;http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.17-winx64.ziphttp://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.22-winx64.ziphttp://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6…

python减小内存占用_如何将Python内存占用缩小20倍?

当程序执行过程中RAM中有大量对象处于活动状态时&#xff0c;可能会出现内存问题&#xff0c;特别是在对可用内存总量有限制的情况下。下面概述了一些减小对象大小的方法&#xff0c;这些方法可以显著减少纯Python程序所需的RAM数量。注: 这是我原帖子的英文版本(原帖子是用俄文…

java发送简单邮件_Java程序实现发送简单文本邮件

/*** Java程序实现发送简单文本邮件** author Administrator**/public class SendTextMail {// 定义发件人地址public static String sendAddress "xxxx163.com";// 定义收件人地址public static String receiveAddress "xxx163.com";// 定义发件人账户名…

java 捕获异常并存入数据库_java异常处理,报异常的话怎么处理对象值,并持久化到数据库中...

展开全部//没看到有人回e68a843231313335323631343130323136353331333365646233答你,我还没学到框架,不知道那个是不是可以很便捷操作你说的这样过程//我写个基础点的,就是一个序列化与反序列化的过程,你这个是要侦测到参数异常的时候//才开始进行序列化操作的,其实我觉得原理应…

金属元素螯合剂:(S)-DOTAGA-(COOt-Bu)4,1023889-20-4,可应用于制备纳米材料

文章关键词&#xff1a;金属元素螯合剂&#xff0c;大环配体&#xff0c;DOTA标记(COOt-Bu)4 ●中文名&#xff1a;(S)-DOTAGA-四叔丁酯 ●英文名&#xff1a;(S)-DOTAGA-(COOt-Bu)4 ●外观以及性质&#xff1a; 西安凯新生物科技有限公司供应的​(S)-DOTAGA-(COOt-Bu)4中DOT…