Java之使用递归查询多级树形结构数据(2)

导读:本篇文章讲解 Java之使用递归查询多级树形结构数据(2),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

上一篇文章里说到使用递归查询多级树形结构数据,后来我想了一下,对于一直循环访问数据库还是不推荐,于是这篇文章对递归查询做了一些优化;既然不要循环访问数据库,那么我们就可以一次把所有数据查出来存到List集合里,再通过递归List把数据存到另一个List也是一个道理,下面上代码

首先依然建了一个测试菜单表:
在这里插入图片描述
实体类:

public class Menu {
    /** 主键id */
    private long ID;
    /** 父类主键 */
    private long parentid;
    /** 菜单名称 */
    private String name;
    /** 菜单类型 */
    private String type;
    /** 菜单编码 */
    private String code;
    /** 子类菜单数据 */
    @TableField(exist = false)
    private List<Menu> childMenu;

	get set方法省略...
}

childMenu是用于装子类数据的;@TableField(exist = false)表示该属性不为数据库表字段,但是必须使用

控制层代码:

@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    public TestService testService;

    @GetMapping("/menu")
    public List<Menu> findMenu() {
        return testService.findMenu();
    }
}

这里我们就不需要传父类主键做参数了

业务实现层代码:

public interface TestService {
    /**
     * 获取菜单多级信息
     * @return List<Menu>
     */
    List<Menu> findMenu();
}

业务层逻辑有所改动,先将所有数据存到List,再递归遍历到另一个List中返回

@Service
public class TestServiceImpl implements TestService {

    @Autowired
    private BaseMapper<Menu> baseMapper;

    @Override
    public List<Menu> findMenu() {
        //数据查询
        List<Menu> list = baseMapper.selectList(new QueryWrapper());
        //新建一个用于接收数据的list
        List<Menu> resultList = new ArrayList<>();
        for (Menu result : list) {
            if (result.getParentID() == 0) {
                //调用方法给子类添加数据
                resultList.add(getMenuTree(result, list));
            }
        }
        return resultList;
    }

    private Menu getMenuTree(Menu result, List<Menu> list) {
        for (Menu menu : list) {
        	//如果父类主键等于传过来实体类的ID
            if (menu.getParentID() == result.getID()) {
                if (result.getChildMenu() == null) {
                    result.setChildMenu(new ArrayList<>());
                }
                // 递归调用
                result.getChildMenu().add(getMenuTree(menu, list));
            }
        }
        return result;
    }
}

sql语句

select id,`name`,`type`,`code`,parentID from menu where parentID = ?

测试一下
使用postman发送请求
在这里插入图片描述
可以看到数据也成功以多级形势返回了
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/98661.html

(0)
小半的头像小半

相关推荐

极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!