java如何实现树形查询

 更新时间:2024年07月17日 09:31:09   作者:安达鲁狗  
这篇文章主要介绍了java实现树形查询方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

java实现树形查询

首先这个树形查询,你肯定不能用他内置sql语句吧

这里我自己在dao层写一句sql语句进行查询

@Query(value = "select * from TB_UIM_MENU_TEST t START WITH t.PID IS NULL" +
        " CONNECT BY PRIOR t.ID = t.PID order by t.PID NULLS first,t.MENU_SORT ASC",nativeQuery = true)
List<MenuTestDTO> findTree();

这里我写的原生sql语句,不原生的俺也不会。

接下来就要实现树形查询了

service层代码我就不po出来了,直接po实现层的代码:

public List findTree() {
    List<MenuTreeVO> list = new ArrayList<>();
    List<MenuTestDTO> dataList = menuTestDAO.findTree();
    List<MenuTreeVO> resultList = new ArrayList<>();
    for (int i = 0; i < dataList.size(); i++) {
        MenuTestDTO menuTestDTO = dataList.get(i);
        MenuTreeVO menuTreeVO = new MenuTreeVO();
        menuTreeVO.setId(menuTestDTO.getId());
        menuTreeVO.setPid(menuTestDTO.getPid());
        menuTreeVO.setLockState(menuTestDTO.getLockState());
        menuTreeVO.setLogo(menuTestDTO.getLogo());
        menuTreeVO.setMenuSort(menuTestDTO.getMenuSort());
        menuTreeVO.setName(menuTestDTO.getName());
        menuTreeVO.setRoute(menuTestDTO.getMenuRoute());
        resultList.add(menuTreeVO);
    }
    for (int i = 0; i < resultList.size(); i++) {
        MenuTreeVO menuTreeVO = resultList.get(i);
        if (menuTreeVO.getPid() == null){
            //一级节点
            list.add(menuTreeVO);
        }else {
            //子节点
            findFather(menuTreeVO,list);
        }
    }
    return list;
}

到这里有人就要问了,你怎么知道不同子级对应的父级是哪个啊,问得好!

在上述方法中有一个方法是findFather()这个就是进行父级寻找的方法,数据库里肯定是有关系的,

下面看看这个findFather()方法

private List findFather(MenuTreeVO private List findFather(MenuTreeVO menuTreeVO,List list){
    for (int i = 0; i < list.size(); i++) {
        MenuTreeVO menuvo = list.get(i);
        //判断是否为对应节点的子节点
        if (menuvo.getId().equals(menuTreeVO.getPid())){
            menuvo.getChildren().add(menuTreeVO);
        }
    }
    return null;
}

像我这里表中是有PID和ID的区别,

子级的PID和父级的ID是一样的,而父级的PID是空的,所以第一个判断使用ID进行判断,

如果ID为空那就是父级,把他取出来存在一个List当中,你得先声明空的集合奥,类似于汉诺塔那样。

然后通过ID和PID的关系再去找子级,需要说的一点是,

我这里用的是域对象转换,自己封装了一下,这个VO中有这么一个元素:

private List<MenuTreeVO> children = new ArrayList<>();

我只能说DDDD,这就是用来存子级的list对象。

大概差不多就是这个意思,自己理解一下就行。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mybatis中返回主键一直为1的问题

    mybatis中返回主键一直为1的问题

    这篇文章主要介绍了mybatis中返回主键一直为1的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • SpringMVC核心DispatcherServlet处理流程分步详解

    SpringMVC核心DispatcherServlet处理流程分步详解

    这篇文章主要介绍了SpringMVC核心之中央调度器DispatcherServlet的相关知识,包括SpringMVC请求处理过程及SrpingMVC容器和spring IOC容器关系,需要的朋友可以参考下
    2023-04-04
  • sharding-jdbc实现分页查询的示例代码

    sharding-jdbc实现分页查询的示例代码

    sharding-jdbc是一个轻量级Java框架,它提供了分布式数据库中间件的功能,支持水平分表和分库分表,在分页查询方面,sharding-jdbc支持两种方式:基于物理分页和基于逻辑分页,本文给大家介绍sharding-jdbc如何实现分页查询,需要的朋友可以参考下
    2024-05-05
  • SpringBoot启动时加载指定方法的方式小结

    SpringBoot启动时加载指定方法的方式小结

    本文主要给大家介绍了Spring Boot项目启动时加载指定方法都有哪些方式的,文中给大家介绍了五种常用的方式,有详细的代码示例,具有一定的参考价值,需要的朋友可以参考下
    2023-08-08
  • BootStrap Jstree 树形菜单的增删改查的实现源码

    BootStrap Jstree 树形菜单的增删改查的实现源码

    这篇文章主要介绍了BootStrap Jstree 树形菜单的增删改查的实现源码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • Java实现图片上文字内容的动态修改的操作步骤

    Java实现图片上文字内容的动态修改的操作步骤

    在数字图像处理领域,Java提供了强大的库来处理图片,包括读取、修改和写入图片,如果你需要在Java应用程序中修改图片上的文字内容,可以通过图像处理技术来实现,这篇博文将介绍如何使用Java实现图片上文字内容的动态修改,需要的朋友可以参考下
    2024-07-07
  • Java处理日期时间的方法汇总

    Java处理日期时间的方法汇总

    这篇文章主要给大家介绍了利用Java中的Calendar 类处理日期时间的方法汇总,其中包括取日期的每部分、取当月的第一天或最后一天、求两个日期之间相隔的天数以及一年前的日期等等的示例代码,有需要的朋友们可以直接参考借鉴,下面来一起看看吧。
    2016-12-12
  • 值得收藏的2017年Java开发岗位面试题

    值得收藏的2017年Java开发岗位面试题

    这篇文章主要为大家推荐一份值得收藏的2017年Java开发岗位面试题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Java 中的CharArrayReader 介绍_动力节点Java学院整理

    Java 中的CharArrayReader 介绍_动力节点Java学院整理

    CharArrayReader 是字符数组输入流。它和ByteArrayInputStream类似,只不过ByteArrayInputStream是字节数组输入流,而CharArray是字符数组输入流。CharArrayReader 是用于读取字符数组,它继承于Reader
    2017-05-05
  • javac、java打jar包命令实例

    javac、java打jar包命令实例

    这篇文章主要演示Java中使用命令打jar包的实例过程,很实用,希望能给大家做一个参考。
    2016-06-06

最新评论