树形菜单实现,利用递归的方式,进行查询,删除,修改添加只是一个简单的修改和删除(个人认为修改时一般不会修改节点 ,根据不同业务需求可能不一样
一个思路吧 如果真要修改节点的话,修改当前的节点是否为根节点,是根节点的话,根节点下边是否有子节点,子子节点,这个应该递归了,如果不是子节点,修改后应该挂在哪个节点之下,有点麻烦就不说了,增加的话,只需要传入,一个父节点就行了,根节点的父节点为0)。
废话有点多了,记录下树形菜单的实现如果有错误的地方还请指出,首先是数据库表结构很简单。
表 person 属性 ID自增,name ,parent_id
实体类:
@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);
}
}
代码都是可以运行的,已经测试过了。