樹形菜單實現,利用遞歸的方式,進行查詢,刪除,修改添加只是一個簡單的修改和刪除(個人認為修改時一般不會修改節點 ,根據不同業務需求可能不一樣
一個思路吧 如果真要修改節點的話,修改當前的節點是否為根節點,是根節點的話,根節點下邊是否有子節點,子子節點,這個應該遞歸了,如果不是子節點,修改后應該掛在哪個節點之下,有點麻煩就不說了,增加的話,只需要傳入,一個父節點就行了,根節點的父節點為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);
}
}
代碼都是可以運行的,已經測試過了。