后台程序也都是常规代码,我们重点关注两点:1.递归调用,2.存储过程调用

递归调用

由于部门的层级不可控,因此如果我想要获取所有部门的完整json的话,就要采用递归调用,这里的递归调用我们可以利用MyBatis的ResultMap中的collection实现,核心代码如下:

  1. <resultMap id="BaseResultMap" type="org.sang.bean.Department">
  2. <id property="id" column="id"/>
  3. <result column="name" property="name"/>
  4. <result column="parentId" property="parentId"/>
  5. <result column="isParent" property="isParent"/>
  6. <collection property="children" ofType="org.sang.bean.Department" select="org.sang.mapper.DepartmentMapper.getDepByPid" column="id">
  7. </collection>
  8. </resultMap>
  9. <select id="getDepByPid" resultMap="BaseResultMap">
  10. select d1.*from department d1 where d1.`parentId`=#{pid} AND d1.enabled=true;
  11. </select>

每一个Department中都有一个children属性,getDepByPid方法的返回结果是一个BaseResultMap,BaseResultMap中的collection又将调用getDepByPid方法,通过这种方式我们可以快速实现一个递归调用。Mapper中只需要定义如下方法即可:

  1. List<Department> getDepByPid(Long pid);

查询结果如下(部分):

  1. [
  2. {
  3. "id": 1,
  4. "name": "股东会",
  5. "parentId": -1,
  6. "enabled": true,
  7. "children": [
  8. {
  9. "id": 4,
  10. "name": "董事长",
  11. "parentId": 1,
  12. "enabled": true,
  13. "children": [
  14. {
  15. "id": 5,
  16. "name": "总经理",
  17. "parentId": 4,
  18. "enabled": true,
  19. "children": [
  20. {
  21. "id": 8,
  22. "name": "财务部",
  23. "parentId": 5,
  24. "enabled": true,
  25. "children": [],
  26. "parent": false
  27. }],
  28. "parent": true
  29. }
  30. ],
  31. "parent": true
  32. }
  33. ],
  34. "parent": true
  35. }
  36. ]

存储过程调用

存储过程调用比较简单,以添加部门为例,如下:

1.Mapper中添加如下方法:

  1. void addDep(@Param("dep") Department department);

2.xml中写法如下:

  1. <select id="addDep" statementType="CALLABLE">
  2. call addDep(#{dep.name,mode=IN,jdbcType=VARCHAR},#{dep.parentId,mode=IN,jdbcType=INTEGER},#{dep.enabled,mode=IN,jdbcType=BOOLEAN},#{dep.result,mode=OUT,jdbcType=INTEGER},#{dep.id,mode=OUT,jdbcType=BIGINT})
  3. </select>

注意statementType调用表示这是一个存储过程,mode=IN表示这是输入参数,mode=OUT表示这是输出参数,调用成功之后,在service中获取department的id和result字段,就能拿到相应的调用结果了。