树形菜单实现,利用递归的方式,进行查询,删除,修改添加只是一个简单的修改和删除(个人认为修改时一般不会修改节点 ,根据不同业务需求可能不一样

一个思路吧 如果真要修改节点的话,修改当前的节点是否为根节点,是根节点的话,根节点下边是否有子节点,子子节点,这个应该递归了,如果不是子节点,修改后应该挂在哪个节点之下,有点麻烦就不说了,增加的话,只需要传入,一个父节点就行了,根节点的父节点为0)。

废话有点多了,记录下树形菜单的实现如果有错误的地方还请指出,首先是数据库表结构很简单。

表 person  属性 ID自增,name ,parent_id

java自动添加树形结构数据库 java树形菜单增删改查_List

 

 

实体类:

@Data
public class Person {
    private Integer id;
    private String name;
    private String parentId;
    private List<Person> children;
}
Mapper文件:
  @Mapper
public interface PersonMapper {

    @Select("select * from person ")
    List<Person>  getPersonList();

    @Insert("insert into person (name, parent_id)values(#{name},#{parentId})")
    Integer save(Person person);

    @Update("update person set name=#{name},parent_id=#{parentId}")
    Integer update(Person person);

    @Delete("delete from person where id=#{id}")
    Integer delete(Integer id);

    @Select("select * from person where id=#{id}")
    Person findById(Integer id);

    @Select("select * from person where parent_id=#{parentId}")
    List<Person> findByParentId(String parentId);
}
service业务层:

  public interface PersonService {
    List<Person> getPersonList();

    Integer save(Person person);

    Integer update(Person person);

    Integer delete(Integer id);
}
serviceImp业务层实现类:
@Service
public class PersonServiceImpl implements PersonService {
    @Resource
    private PersonMapper personMapper;

    @Override
    public List<Person> getPersonList() {
        //查询所有的数据
       List<Person> allList= personMapper.getPersonList();
    //创建一个list集合,用于存放根节点
       List<Person> parent=new ArrayList<>();
        for(Person person:allList){
       //如果parentId为0,则代表是根节点,存入到集合中
            if(person.getParentId().equals("0")){
                parent.add(person);
            }
        }
        //查找根节点下的子类,因为根节点的id就是 子节点的parentId;
        for(Person person:person){
            List<Person> children=getChild(person.getId(),allList);
            person.setChildren(children);
        }
        return child;
    }
  //查找子节点的方法
    private List<Person> getChild(Integer id, List<Person> allList) {
    //存放子节点的集合
        List<Person> children=new ArrayList<>();
        for (Person person:allList){
       //如果根节点的id 等于集合内parentid,说明是根节点的子节点
            if(person.getParentId().equals(id.toString())){
        //存入子节点集合
                children.add(person);
            }
        }

        for (Person person:children){
      //递归调用,如果子节点存在根节点,则再次调用,往后依次推
           List<Person> personChildren= getChild(person.getId(),allList);
           person.setChildren(personChildren);
        }
    //递归结束条件,如果子节点不存在子节点,则递归结束
        if(children==null){
            return null;
        }
        return children;
    }

    @Override
    public Integer save(Person person) {
        return personMapper.save(person);
    }

    @Override
    public Integer update(Person person) {
        return personMapper.update(person);
    }

    @Override
    public Integer delete(Integer id) {
    //首先查出当前节点是否存在子节点,如果存在,则遍历删除子节点
        List<Person> personList=personMapper.findByParentId(id.toString());
        System.out.println(personList);
    //递归查出所有的子节点,personList为null是递归结束条件,如果当前子节点还存在子节点,则再次执行当前方法,只到找到不存子节点的那项结束
    //速度有点慢,暂且这样吧
        if(personList!=null&&personList.size()>0){
            for (Person person:personList){
                delete(person.getId());
            }
        }
        return personMapper.delete(id);
    }
}
接口层:
@RestController
@RequestMapping("/person")
public class PersonController {

    @Resource
    private PersonService personService;

    @GetMapping("/list")
    public List<Person> list(){
        return personService.getPersonList();
    }

    @PostMapping("/save")
    public Integer save(@RequestBody Person person){

        return personService.save(person);
    }

    @PutMapping("/edit")
    public Integer edit(@RequestBody Person person){

        return personService.update(person);
    }

    @DeleteMapping("/delete")
    public Integer delete(@RequestParam Integer id){
        return personService.delete(id);
    }
}
代码都是可以运行的,已经测试过了。