Java后端项目实现无限极树 - 案例:部门树 - Department实体类

1、domain层<Department> - 实体类 - 需要添加字段

字段案例:

//部门树参数 - 无限极树用  - new ArrayList<>()  - 防空指针异常
//用于封装当前部门的子部门
//坑:children这个单词不能乱写,必须与elementUI的上传组件中保持一致,不然前端没有数据
@JsonInclude(JsonInclude.Include.NON_EMPTY)   //部门树最后一级没有数据就不显示
private List<Department> children = new ArrayList<>();

注意:该表名为department表,如下图示,其中的 parent_id 字段如值2,对应的是本表的 id 字段值 2,即是自己查自己,本案例是针对这种情况实现的,若表中parent_id字段对应的值并不在本表中,原理也是一样的

 

2. controller层 - 对接前端的接口 - restful风格

类上注解为:

@RestController
@RequestMapping("/department")
@Api(value = "部门接口类", description = "部门相关的CRUD功能接口")

service注入为:

@Autowired
private IDepartmentService departmentService;

部门树接口案例:

/**
 * 接口:部门树
 * @param
 * @return
 */
@ApiOperation(value = "查询部门树")
@GetMapping("/deptTree")
public List<Department> getDeptTree() {
    return departmentService.deptTree();
}

3. service层 - 业务类接口

业务接口案例:

/**
 * 接口:部门树
 * @param
 * @return
 */
List<Department> deptTree();

4.impl层 - 业务实现类 -

1)类上加注解

@Service

@CacheConfig(cacheNames = "dept") //操作redis缓存 - 关联dept

2)mapper注入:

@Autowired
private DepartmentMapper departmentMapper;

3)业务实现案例:

/**
 * 部门树 - 无限极树业务类
 *
 * @param
 * @return
 */
@Override
@Cacheable(cacheNames = "dept", key = "'tree'")  //添加缓存到redis
public List<Department> deptTree() {
    return getDeptTree();
}

private List<Department> getDeptTree() {
    // 1. 一次性查询出所有数据,放到内存中,可以使用map  -  做缓存用
    // 2. 从所有数据中找出第一层级/顶级部门:这就是我们需要返回的数据
    // 3. 遍历所有部门只要不是第一层级的,找自己的上级,并将自己放入上级的children中
    //将所有的部门撞到map中  - 每次获取父部门都从这里获取
    List<Department> all = departmentMapper.findAll();
    Map<Long, Department> map = new HashMap<>();
    for (Department department : all) {
        map.put(department.getId(), department);
    }

    //前端需要得到的集合数据 - 部门树
    List<Department> deptTree = new ArrayList<>();
    for (Department department : all) { //循环置值
        if (department.getParentId() == null) {//顶级部门的情况
            deptTree.add(department);
        } else {//不是顶级部门的情况
            //1.想办法找到当前部门的 父部门
            Long parent_id = department.getParentId();
           
            //从上面的Map中去获取的 - 以前装进去的对象还是会存在
            Department parentDepartment = map.get(parent_id);
            if (parentDepartment != null) {  //防止空指针,过滤出错数据
                //2.将自己装到  父部门 的children中
                parentDepartment.getChildren().add(department);
            }
        }
    }
    return deptTree;
}

注意:在业务实现时,其实只用到了 departmentMapper 中的一个 findAll() 方法,即查询所有对象数据,所以在 mapper 层以及 sql 语句中不会有所新增(基础的 CRUD 方法一般而言早就写好了),至此,部门数的后端业务就已经全部实现了,剩下的就是前端的事了。

可能会用到的 redis 依赖:

<!--spirngboot springdata对redis支持-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<!--整合Redis , 底层可以用jedis-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

文章写得有点简陋,但如果能对您有所帮助,鄙人不胜荣幸。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值