java如何实现递归删除树形数据的任一个节点
作者:朱衣点头戈子衫
文章讲述了在Java中实现递归删除树形数据的任一个节点时需要注意的三个点,包括删除的节点包含子节点、删除子节点和其他子节点删除的节点不包含子节点、以及该父节点变成叶子节点,此外,文章还提到这两件事包含在同一件事务中
java实现递归删除树形数据的任一个节点
需要注意3个点
- 删除的节点包含子节点,删除子节点和其他子节点
- 删除的节点不包含子节点,该父节点变成叶子节点
- 另外这两件事包含在同一件事务中,具有原子性
实现方法
- 递归遍历节点和其子节点
- 具有原子性,创建一个方法,开启事务,
事务的一般手动开启方法
Connection connection = JDBCUtil_C3P0.getConnection();
try {
//关闭事务自动提交(开启事务)
connection.setAutoCommit(false);
//...你的操作
//以上全部操做无异常则提交事务
connection.commit();
} catch (SQLException e) {
//一旦事务中有哪一步操做发生异常则进行事务回滚
connection.rollback();
e.printStackTrace();
}finally{
//关闭链接资源
//...
}
后端使用递归删除树形结构的所有子节点
controller
/**
* 根据id删除树节点
*
* @param id 待删除节点的id
* @return true/false
*/
@RequestMapping("/deleteTreeNodeById")
public ResponseData<Boolean> deleteTreeNodeById(@RequestParam(name = "id") String id) {
return successWithData(configDictService.deleteTreeNodeById(id));
}service接口
boolean deleteTreeNodeById(String id);
service接口实现类
@Override
public boolean deleteTreeNodeById(String id) {
List<String> deleteIdList = new LinkedList<>();
deleteIdList.add(id);
getAllChildrenIdList(id, deleteIdList);
return baseMapper.deleteBatchIds(deleteIdList) == 1;
}
/**
* 递归查询当前节点下所有孩子节点id列表
*
* @param id
* @param deleteIdList
*/
private void getAllChildrenIdList(String id, List<String> deleteIdList) {
QueryWrapper<ConfigDict> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(ConfigDict.PARENT_ID, id);
List<ConfigDict> childrenList = baseMapper.selectList(queryWrapper);
if (CollectionUtil.isNotEmpty(childrenList)) {
for (ConfigDict children : childrenList) {
deleteIdList.add(children.getId());
getAllChildrenIdList(children.getId(), deleteIdList);
}
}
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
