第一步写sql语句查询所有数据,或者根据条件查询所有需要的数据

我这边是根据创建的时间升序来排列的

    <sql id="selectionCondition">
        <if test="materialId != null">and MATERIAL_ID=#{materialId}</if>
        <if test="materialCode != null">and MATERIAL_CODE=#{materialCode}</if>
        <if test="materialName != null">and MATERIAL_NAME=#{materialName}</if>
        <if test="parentId != null">and PARENT_ID=#{parentId}</if>
        <if test="type != null">and TYPE_=#{type}</if>
        <if test="status != null">and STATUS_=#{status}</if>
    </sql>

    <!--通过实体作为筛选条件查询-->
    <select id="selectTree" resultMap="BaseResultMap">
       select                         
       MATERIAL_ID,MATERIAL_CODE,MATERIAL_NAME,MATERIAL_LEVEL_CODE,INDEX_,
       PARENT_ID,TYPE_,CREATE_USER_ID,CREATE_DATE,MODIFY_USER_ID,MODIFY_DATE,
       ENABLE_,STATUS_,REMARK_,INVENTORY_
       from 
       biz_material
       <where>
            <include refid="selectionCondition"/>
       </where>
             ORDER BY INDEX_ asc,CREATE_DATE asc

    </select>

第二步写mapper层代码返回一个List集合

	List<BizMaterial> selectTree(BizMaterial bizMaterial);

第三步写一个dto类继承自己需要查询返回部门表的类并且写一个属性(BizMaterial是我要查询的的部门表)

public class BizMaterialDto extends BizMaterial {

   private List<BizMaterialDto> childMaterials = new ArrayList<>();

    public List<BizMaterialDto> getChildMaterials() {
        return childMaterials;
    }

    public void setChildMaterials(List<BizMaterialDto> childMaterials) {
        this.childMaterials = childMaterials;
    }
}

第四部在service层写一个接口

 Result selectAll();

第五步在serviceImpl层写一个实现类

  public Result selectAll() {
        //新建一个对象
        BizMaterial bizMaterial = new BizMaterial();
        //查询所有的数据
        List<BizMaterial> bizMaterials = bizMaterialMapper.selectTree(bizMaterial);
        //如果为空的话就直接return
        if(CollectionUtils.isEmpty(bizMaterials)){
            return new Result(1,"查询失败")
        }

        List<BizMaterialDto> bizMaterialDtoList = Util.copyList(bizMaterials, BizMaterialDto.class);

        //获取一级物资模板
        List<BizMaterialDto> topMaterial = bizMaterialDtoList.stream().filter(material -> material.getParentId().intValue() == Constant.NUM_ZERO).collect(Collectors.toList());

        // 为一级人员模板设置子人员模板,planPersonChild是递归调用的
        for (BizMaterialDto materialDto : topMaterial) {
            materialChild(bizMaterialDtoList, materialDto);
        }
        return new Result(0,"查询成功",topMaterial);;
    }



    //递归的方法
    private BizMaterialDto materialChild(List<BizMaterialDto> materialList,BizMaterialDto parent) {
        for (BizMaterialDto materialDto : materialList) {
            if (materialDto.getParentId().equals(parent.getMaterialId())) {
                parent.getChildMaterials().add(materialDto);
                materialChild(materialList, materialDto);
            }
        }
        return parent;
    }

第六步就是controller层的代码了就一行代码就没有了

    /**
     * 查询所有
     *
     * @return
     */
    @RequestMapping(value = "/selectAll")
    public Result selectAll() {
            return bizMaterialService.selectAll();
    }

最后就是以树的结构展示出来了,希望保姆式教学希望对大家有用,如果对大家有帮助希望大家评论个有用