java使用一张表玩递归Tree

博客介绍了在菜单开发中常用的递归方法,涉及表数据、实体类、mapper层、mapper.xml、service层和controller层。同时提醒玩递归时要注意传值,否则会陷入死循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个东西一般在我们做一些菜单的时候会经常用到,所以我把他写成博客。

这是一个很简单的玩递归方法。

表数据:

                            

实体类:

@Data
public class BusinessServiceTreeDto {
    
    //值
    private Integer value;
    //显示值
    private String label;
    //当前实体类的集合
    private List<BusinessServiceTreeDto> children;
}

mapper层:

    /**
     * 根据id查询出服务类型
     * @author      hhh
     * @date        2019/5/23 11:53
     */
    List<Business> selectBusiness(Integer id);

mapper.xml:

 <select id="selectBusiness" resultMap="BaseResultMap" parameterType="integer">
        SELECT * FROM base_business WHERE pid=#{id} and delFlag=0
    </select>

service层

 /**
     * 服务类别的树形数据查询
     * @author      hhh
     * @date        2019/5/23 15:33
     */
    @Override
    public List<BusinessServiceTreeDto> selectServiceClass(Integer id) {
        //那到id作为条件进行查询  查出他pid为0的集合
        List<Business> serviceCalsses = businessMapper.selectBusiness(id);
        List<BusinessServiceTreeDto> list=new ArrayList<>();
        //遍历它往封装类添加值
        for (Business serviceCalss : serviceCalsses) {
            BusinessServiceTreeDto serviceClassDto=new BusinessServiceTreeDto();
            serviceClassDto.setValue(serviceCalss.getId());
            serviceClassDto.setLabel(serviceCalss.getName());
            //调用selectServiceClassChildren方法进行添加值
            serviceClassDto.setChildren(selectServiceClassChildren(serviceCalss.getId()));
            list.add(serviceClassDto);
        }
        return list;
    }


/**
     * 根据传过来的id进行查询 得到他下面的子集
     * @author      hhh
     * @date        2019/5/23 15:01
     */
    public List<BusinessServiceTreeDto> selectServiceClassChildren(Integer id){
        //根据他传过来的id作为查询
        List<Business> serviceClasses = businessMapper.selectBusiness(id);
        //如果这个集合的数据大小为0那么就退出当前方法
        if(serviceClasses.size()==0){
            return null;
        }
        List<BusinessServiceTreeDto> list=new ArrayList<>();
        //查询出来的结果大小大于0进行循环递归
        for (Business serviceClass : serviceClasses) {
            BusinessServiceTreeDto serviceClassDto=new BusinessServiceTreeDto();
            serviceClassDto.setValue(serviceClass.getId());
            serviceClassDto.setLabel(serviceClass.getName());
            //递归调用当前的pid作为条件
            serviceClassDto.setChildren(selectServiceClassChildren(serviceClass.getId()));
            list.add(serviceClassDto);
        }
        return list;
    }



 

controller层:

    /**
     * 服务类别的树形数据查询
     * @author      hhh
     * @date        2019/5/23 15:34
     */
    @GetMapping("/selectServiceClass")
    public List<BusinessServiceTreeDto> selectServiceClass(){
        return businessService.selectServiceClass(0);
    }

 

玩递归的时候要注意它传的值,传错值会的话会在当前死循环,会把自己玩蹦的

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值