1. 程式人生 > >遞歸刪除資源樹 Ztree

遞歸刪除資源樹 Ztree

cat lis 刪除節點 若是 body urn turn comment log

前言

  • 最近項目裏有這麽一個需求:現在有一個用Ztree編寫的資源樹,當刪除資源樹的某個節點時,則將此節點下面的所有節點全部刪除,這裏顯然就用到了遞歸;若此節點被刪除後無其它的兄弟節點了,我們還需要將其父節點更新成新的子節點。

代碼中用到的技術

  • 小編操作數據庫用的是mybatis,大部分操作直接使用的mybatis的逆向工程,至於mapper的註入,我就不貼代碼了。

1、刪除節點的入口

public void deleteCategory(Long id) {
    //將此節點對象從數據庫中搜出來
    TbContentCategory node = categoryMapper.selectByPrimaryKey(id);
    //刪除此節點
    this.recursiveDelete(id);
    //判斷是否更新父節點
    this.updateParentNode(node.getParentId());
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2、遞歸刪除資源樹上的節點

/**
 * 遞歸刪除資源樹上的節點
 * @param 要刪除的節點id
 */
public void recursiveDelete(Long id) {
    // 查詢此節點下面的所有的子節點
    List<TbContentCategory> list = getListByParentId(id);
    // 若此節點下面沒有子節點
    if (list.size() == 0) {
        TbContentCategory deleteNode = categoryMapper.selectByPrimaryKey(id);
        //得到此節點的父節點Id
        Long parentId = deleteNode.getParentId();
        //刪除此節點
        categoryMapper.deleteByPrimaryKey(id);
        //刪除此節點後,判斷此節點的父節點是否為子節點,若是,則更新其父節點為子節點
        this.updateParentNode(parentId);
    } else {
        categoryMapper.deleteByPrimaryKey(id);
        for (TbContentCategory category : list) {
            if (category.getIsParent()) {
                //遞歸刪除節點
                this.recursiveDelete(category.getId());
            } else {            categoryMapper.deleteByPrimaryKey(category.getId());
            }
        }

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

3、刪除子節點後,判斷其父節點是否需要更新成子節點

/**
 * 判斷此節點是否存在兄弟節點,若不存在,則將其父節點更新成子節點
 * @param 節點Id
 */
private void updateParentNode(Long parentId) {
    //查詢此節點的所有的兄弟節點
    List<TbContentCategory> contentCat = getListByParentId(parentId);
    //若無兄弟節點
    if (contentCat.size() == 0) {
        //更新此節點的父節點為子節點
        TbContentCategory node2 = categoryMapper.selectByPrimaryKey(parentId);
        node2.setIsParent(false);
        categoryMapper.updateByPrimaryKeySelective(node2);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

4、根據父節點Id 查詢所有的兄弟節點

/**
 * 根據父節點Id 查詢所有的兄弟節點
 * @param parentId
 * @return
 */
public List<TbContentCategory> getListByParentId(Long parentId) {
    TbContentCategoryExample example = new TbContentCategoryExample();
    Criteria criteria = example.createCriteria();
    criteria.andParentIdEqualTo(parentId);
    List<TbContentCategory> list = categoryMapper.selectByExample(example);
    return list;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

遞歸刪除資源樹 Ztree