为了账号安全,请及时绑定邮箱和手机立即绑定

一张表多级分类查询

标签:
Java

图片描述

前言

关于分类表的设置,之前有人可能相关设置无限级的分类模式,让系统中的分类,可以无限划分下去,但是没有哪个分类可以设置设置特别多的分类,还让人看着不晕,所以无限级的分类最多就是个思想,首先我先展示一个数据库表结构

图片描述

这张表的结构很简单,就是为每一行设置一个父标志,这样对于每一个子元素来说,只需要找到自己的父元素就够了,于是无限级应运而生,可是,数据库里查询的数据,如果只是查出来,父元素只是一个ID,是不够的,显示也不够友好,就好像这样

图片描述

于是如何从数据库汇总查询并返回父元素信息呢?显然这样的逻辑,数据库比较难做到,基本都要使用存储过程,接下来,我要展示的代码主要是通过Java实现的,下面的代码就是非递归的方式查询并返回父元素的过程

// 获取全部分类,数据库内做了限制不会无限制查询条目
List<ProductCategory> productCategorylist = productCategoryService.getListAll();
// 第一层循环用于遍历全部条目
for (int a = 0; a < productCategorylist.size(); a++) {
    // 判断是否是顶级元素,即没有子元素的分类
    if (productCategorylist.get(a).getParentId() != 0) {
        // 如果不是顶级元素
        for (int b = 0; b < productCategorylist.size(); b++) {
            // 当前循环条目(b)的编号是否是外层循环父ID
            if (productCategorylist.get(b).getId() == productCategorylist.get(a).getParentId()) {
                // 如果找到了(等于a这个父亲找到了孩子)当前循环条目判断是否为空
                if (productCategorylist.get(b).getChildren() == null) {
                    // 如果为空表示第一次添加新建列表添加
                    List<ProductCategory> list = new ArrayList<ProductCategory>();
                    list.add(productCategorylist.get(a));
                    productCategorylist.get(b).setChildren(list);
                } else {
                    // 如果不为空表示不是第一次了,就直接加
                    productCategorylist.get(b).getChildren().add(productCategorylist.get(a));
                }
            }
        }
    }
}

代码很好理解,就是两层for循环,找到子元素后就把子元素加入就行了。其实也可以递归的方式来实现该点。

递归的方式我还没想好怎么写,脑子有点懵,等我想出来我再贴出来吧。

理解

其实递归没有非递归效率高,这个我也只是听老师说的,实际在生产过程中,没有实际体会,所以我用非递归的方式实现的代码,效果还不错,不过上面的代码,返回的是全部分类的列表,分类如果有子类,则会显示子类

"productCategorylist": [
            {
                "id": 1,
                "name": "药品",
                "parentId": 0,
                "children": [
                    {
                        "id": 3,
                        "name": "处方药",
                        "parentId": 1,
                        "children": null,
                        "content": "",
                        "img": "/upload/product/category/aASaaaee2lw9Aexll0x61s1xlsl6a926.png"
                    },
                    {
                        "id": 4,
                        "name": "非处方药",
                        "parentId": 1,
                        "children": null,
                        "content": null,
                        "img": null
                    },
                    {
                        "id": 5,
                        "name": "内用药",
                        "parentId": 1,
                        "children": [
                            {
                                "id": 14,
                                "name": "冲剂",
                                "parentId": 5,
                                "children": null,
                                "content": null,
                                "img": "/upload/product/category/lAAxxSeAxe619sxs660e62twSl6al0al.png"
                            },
                            {
                                "id": 15,
                                "name": "口服液",
                                "parentId": 5,
                                "children": null,
                                "content": null,
                                "img": "/upload/product/category/9ASe06xwaaAx2watSxl9aaw1SltSsa6l.png"
                            }
                        ],
                        "content": "",
                        "img": "/upload/product/category/ee6Al2ltxSal6626xsel0AlSsl1A9tSS.png"
                    },
                    {
                        "id": 6,
                        "name": "外用药",
                        "parentId": 1,
                        "children": [
                            {
                                "id": 11,
                                "name": "涂抹软膏",
                                "parentId": 6,
                                "children": null,
                                "content": null,
                                "img": "/upload/product/category/6etl6l0662sA69xA6t1sseAeA91xel2a.png"
                            }
                        ],
                        "content": "",
                        "img": "/upload/product/category/2xA2As01w9aSSl66es9lw9ltSAltSa6l.png"
                    },
                    {
                        "id": 7,
                        "name": "西药",
                        "parentId": 1,
                        "children": null,
                        "content": "",
                        "img": "/upload/product/category/26x6ax0ax21t01wae29Swe6xe99l2009.png"
                    }
                ],
                "content": null,
                "img": null
            },
            {
                "id": 2,
                "name": "非药品",
                "parentId": 0,
                "children": [
                    {
                        "id": 9,
                        "name": "卫生材料",
                        "parentId": 2,
                        "children": null,
                        "content": null,
                        "img": "/upload/product/category/eeexs6w2xS6l62lAxa2l06tStsS6eaSa.png"
                    },
                    {
                        "id": 10,
                        "name": "医疗器材",
                        "parentId": 2,
                        "children": null,
                        "content": null,
                        "img": "/upload/product/category/swlsw9lsll9lsAl6e2tx6l19x6tx1Al2.png"
                    }
                ],
                "content": null,
                "img": null
            }

上面就是我通过这段代码查询出的JSON串。

结尾

图片描述

其实多亏疫情这段时间的休息,让我自己酝酿的个人项目有了迅猛的发展,不然,我甚至会觉得,我的项目会无限期拖延下去,因为平时忙工作,闲暇时间可能需要做别的事情,真的很难做到为自己的项目潜心开发。我目前还在犹豫,是否需要开源我的项目,目前还未开放源码出来,我觉得开源出来可能会比较好吧,比较自己写的没人知道,只有做出来了让别人看到,才能知道自己的不足之处,让别人也帮忙修改自己的代码。
最近在工作中转为了开发,学到很多开发的新思想,让我对很多代码的认识有了更进一步的理解,觉得果然还是老外的代码写得厉害,只是决定厉害而已,但是也让我更加想写出自己的代码。

武汉加油!我是武汉人,我相信这次疫情,让我们都成长不少,在家学习,在家陪父母,让我们静下来,反思自己,反思人生。

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
30
获赞与收藏
154

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消