使用mybatis进行递归操作

一,适用场景 

  当业务中要查询带层级的数据时,并且不知道层级数或者层级大于三级时,使用递归操作把数据整合成要展示的数据时。当然编程语言同样可以做到,本次只是阐述用mybatis时的用法。

二、数据库数据结构说明

 id 当前数据主键,也是标识

parentId 标识当前数据的父id -1则代表是一级

depPath 存放用于查询自己上级,或者下属层级的数据时比较方便 (业务方面)

适用场景:比如某银行某业务需要审批才能让客户看到,该业务需要操作人员的上级才有审批权限,并且该操作人员可以审批他下级人员所操作的业务,那这个时候要么我们就要去关联查询他的上级和下级人员,由于不知道当前人员所属层级结构,也会用到递归,且相当繁琐,但是如果在更新层级人员时就储存好层级关系,使用时肯定非常方便。

三、持久层调用书写

package com.dong.boot.service;

import com.dong.boot.mapper.DepartmentMapper;
import com.dong.boot.model.Department;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class DepartmentService {
    @Autowired
    DepartmentMapper departmentMapper;

    public List<Department> getAllDepartment() {
        return departmentMapper.getAllDepartmentsByParentId(-1);
    }
}

getAllDepartmentsByParentId(-1) 意思是根据父id查询出所属下级的信息

四、mybatis xml的书写

   <resultMap id="BaseResultMap" type="com.dong.boot.model.Department">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
        <result column="parentId" property="parentId" jdbcType="INTEGER"/>
        <result column="depPath" property="depPath" jdbcType="VARCHAR"/>
        <result column="enabled" property="enabled" jdbcType="BIT"/>
        <result column="isParent" property="isParent" jdbcType="BIT"/>
    </resultMap>

    <resultMap id="DepartmentWithChildren" type="com.dong.boot.model.Department" extends="BaseResultMap">
        <collection property="children" ofType="com.dong.boot.model.Department" select="com.dong.boot.mapper.DepartmentMapper.getAllDepartmentsByParentId" column="id">

        </collection>
    </resultMap>
    <sql id="Base_Column_List">
    id, name, parentId, depPath, enabled, isParent
  </sql>

    <select id="getAllDepartmentsByParentId" resultMap="DepartmentWithChildren">
        select <include refid="Base_Column_List"/> from department where parentId =#{pid}
    </select>

getAllDepartmentsByParentId每次都会查询出一个存放bean的list,然后再根据每个bean的父id去查询下一层级,最终就会查询出下面层级的数据

五、查询结果

[
    {
        "id": 1,
        "name": "股东会",
        "parentId": -1,
        "depPath": ".1",
        "enabled": true,
        "children": [
            {
                "id": 4,
                "name": "董事会",
                "parentId": 1,
                "depPath": ".1.4",
                "enabled": true,
                "children": [
                    {
                        "id": 5,
                        "name": "总办",
                        "parentId": 4,
                        "depPath": ".1.4.5",
                        "enabled": true,
                        "children": [
                            {
                                "id": 8,
                                "name": "财务部",
                                "parentId": 5,
                                "depPath": ".1.4.5.8",
                                "enabled": true,
                                "children": [],
                                "result": null,
                                "parent": false
                            },
                            {
                                "id": 78,
                                "name": "市场部",
                                "parentId": 5,
                                "depPath": ".1.4.5.78",
                                "enabled": true,
                                "children": [
                                    {
                                        "id": 81,
                                        "name": "华北市场部",
                                        "parentId": 78,
                                        "depPath": ".1.4.5.78.81",
                                        "enabled": true,
                                        "children": [
                                            {
                                                "id": 85,
                                                "name": "石家庄市场部",
                                                "parentId": 81,
                                                "depPath": ".1.4.5.78.81.85",
                                                "enabled": true,
                                                "children": [],
                                                "result": null,
                                                "parent": false
                                            }
                                        ],
                                        "result": null,
                                        "parent": true
                                    },
                                    {
                                        "id": 82,
                                        "name": "华南市场部",
                                        "parentId": 78,
                                        "depPath": ".1.4.5.78.82",
                                        "enabled": true,
                                        "children": [],
                                        "result": null,
                                        "parent": false
                                    },
                                    {
                                        "id": 86,
                                        "name": "西北市场部",
                                        "parentId": 78,
                                        "depPath": ".1.4.5.78.86",
                                        "enabled": true,
                                        "children": [
                                            {
                                                "id": 87,
                                                "name": "西安市场",
                                                "parentId": 86,
                                                "depPath": ".1.4.5.78.86.87",
                                                "enabled": true,
                                                "children": [
                                                    {
                                                        "id": 89,
                                                        "name": "莲湖区市场",
                                                        "parentId": 87,
                                                        "depPath": ".1.4.5.78.86.87.89",
                                                        "enabled": true,
                                                        "children": [],
                                                        "result": null,
                                                        "parent": false
                                                    }
                                                ],
                                                "result": null,
                                                "parent": true
                                            }
                                        ],
                                        "result": null,
                                        "parent": true
                                    }
                                ],
                                "result": null,
                                "parent": true
                            },
                            {
                                "id": 91,
                                "name": "技术部",
                                "parentId": 5,
                                "depPath": ".1.4.5.91",
                                "enabled": true,
                                "children": [],
                                "result": null,
                                "parent": false
                            },
                            {
                                "id": 92,
                                "name": "运维部",
                                "parentId": 5,
                                "depPath": ".1.4.5.92",
                                "enabled": true,
                                "children": [
                                    {
                                        "id": 93,
                                        "name": "运维1部",
                                        "parentId": 92,
                                        "depPath": ".1.4.5.92.93",
                                        "enabled": true,
                                        "children": [],
                                        "result": null,
                                        "parent": false
                                    },
                                    {
                                        "id": 94,
                                        "name": "运维2部",
                                        "parentId": 92,
                                        "depPath": ".1.4.5.92.94",
                                        "enabled": true,
                                        "children": [],
                                        "result": null,
                                        "parent": false
                                    }
                                ],
                                "result": null,
                                "parent": true
                            }
                        ],
                        "result": null,
                        "parent": true
                    }
                ],
                "result": null,
                "parent": true
            },
            {
                "id": 96,
                "name": "bbb",
                "parentId": 1,
                "depPath": ".1.96",
                "enabled": true,
                "children": [
                    {
                        "id": 104,
                        "name": "111",
                        "parentId": 96,
                        "depPath": ".1.96.104",
                        "enabled": true,
                        "children": [],
                        "result": null,
                        "parent": false
                    }
                ],
                "result": null,
                "parent": true
            }
        ],
        "result": null,
        "parent": true
    }
]

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用MyBatis递归查询实现树形结构的查询。具体步骤如下: 1. 定义实体类 定义一个实体类,表示树的节点,包含节点id、父节点id、节点名称等属性。 2. 定义Mapper接口 定义一个Mapper接口,包含一个方,用于查询树形结构的节点。方的返回值为List集合,表示查询到的树形结构的节点。 3. 编写Mapper.xml配置文件 在Mapper.xml配置文件中,编写递归查询语句,通过查询语句实现树形结构的查询。具体实现方式如下: - 定义一个select语句,用于查询指定节点的所有子节点。 - 在select语句中,使用union all关键字连接多个子查询语句,实现递归查询。 - 在子查询语句中,使用with recursive关键字定义递归查询语句。 4. 调用Mapper接口 在Java代码中,调用Mapper接口的方,获取查询到的树形结构的节点。可以通过递归遍历节点,实现树形结构的展示。 下面是一个示例代码,供参考: ``` // 定义实体类 public class TreeNode { private Integer id; private Integer parentId; private String name; // getter和setter方 } // 定义Mapper接口 public interface TreeNodeMapper { List<TreeNode> selectTreeNodes(Integer parentId); } // 编写Mapper.xml配置文件 <select id="selectTreeNodes" parameterType="java.lang.Integer" resultType="TreeNode"> with recursive cte(id, parent_id, name) as ( select id, parent_id, name from tree_node where parent_id = #{parentId} union all select tn.id, tn.parent_id, tn.name from tree_node tn inner join cte on tn.parent_id = cte.id ) select * from cte; </select> // 调用Mapper接口 @Autowired private TreeNodeMapper treeNodeMapper; public List<TreeNode> getTreeNodes(Integer parentId) { return treeNodeMapper.selectTreeNodes(parentId); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值