这个东西一般在我们做一些菜单的时候会经常用到,所以我把他写成博客。
这是一个很简单的玩递归方法。
表数据:
实体类:
@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);
}
玩递归的时候要注意它传的值,传错值会的话会在当前死循环,会把自己玩蹦的