Mybatis返回树形结构

在返回json数据时常常需要返回树形的结构,自己去写递归来构建树的话又太麻烦了。
下面介绍一种使用mybatis来返回树形结构的好方法

表结构展示

表里面需要记录父级Id
在这里插入图片描述

MyBatis一对多collection用法

第一次用过org_id找到符合的数据,返回给orgTreeMap,关键就在这个resultMap里面,有一个集合,集合又去调用了getOrgByParentId方法,该方法把查询的到的org_id,当作parent_id来查找,getOrgByParentId又返回要给orgTreeMap这样就形成了递归查询。

    <resultMap id="orgTreeMap" type="com.ylz.api.vo.OrgVO">
        <result column="org_id" jdbcType="VARCHAR" property="orgId"/>
        <result column="org_name" jdbcType="VARCHAR" property="orgName"/>
        <result column="parent_id" jdbcType="VARCHAR" property="parentId"/>
        <collection column="org_id" property="children"  ofType="com.ylz.api.vo.OrgVO"  select="getOrgByParentId" >
        </collection>
    </resultMap>
    <select id="getOrgTree" parameterType="java.lang.String" resultMap="orgTreeMap">
        select o.org_id, o.org_name, o.parent_id
        from org_table@allcenter_db o
        where o.org_id = #{orgId}
    </select>
    <select id="getOrgByParentId" parameterType="java.lang.String" resultMap="orgTreeMap">
        select o.org_id, o.org_name, o.parent_id
        from org_table@allcenter_db o
        where o.parent_id = #{orgId}
    </select>

返回类

@JsonIgnoreProperties(ignoreUnknown = true)
public class OrgVO {

    private String orgId;
    private String orgName;
    private String parentId;//父机构id
    private List<OrgVO> children;
 }

调用

    public String orgTree(OverviewPojo overviewPojo) {
        OrgVO orgVO = userMapper.selectOrgInfoByUserId(overviewPojo.getUserId());
        List<OrgVO> orgTree = orgMapper.getOrgTree(orgVO.getOrgId());
        return ReturnJsonFormatUntil.json(true, AnalysisJson.parseListWithGson(orgTree));
    }

返回树形结构的json数据

在这里插入图片描述

JDK8返回树形结构

public class 树型关系 {

    public static void main(String[] args) {
        //初始化数据
        NodeTree NodeTree1 = new NodeTree("xx1",1,-1);
        NodeTree NodeTree2 = new NodeTree("xx2",2,-1);
        NodeTree NodeTree3 = new NodeTree("xx3",3,-1);
        NodeTree NodeTree4 = new NodeTree("xx4",4,1);
        NodeTree NodeTree5 = new NodeTree("xx5",5,2);
        NodeTree NodeTree6 = new NodeTree("xx6",6,3);
        NodeTree NodeTree7 = new NodeTree("xx7",7,4);
        NodeTree NodeTree8 = new NodeTree("xx8",8,7);
        NodeTree NodeTree9 = new NodeTree("xx9",9,5);
        List<NodeTree> list = new ArrayList<>();
        list.add(NodeTree1);
        list.add(NodeTree2);
        list.add(NodeTree3);
        list.add(NodeTree4);
        list.add(NodeTree5);
        list.add(NodeTree6);
        list.add(NodeTree7);
        list.add(NodeTree8);
        list.add(NodeTree9);
        List<NodeTree> collect = list.stream()
                //找到所有最顶级的节点
                .filter(e -> e.pid.equals(-1))
                //查找顶级节点的所有子节点
                .map(e -> covert(e, list))
                .collect(Collectors.toList());
        System.out.println(collect);

    }

    /**
     * 返回当前节点的以及所有子节点
     * @param nodeTree 当前节点
     * @param nodeTreeList 所有节点
     * @return
     */
    public static NodeTree covert(NodeTree nodeTree, List<NodeTree> nodeTreeList) {
        List<NodeTree> children = nodeTreeList.stream()
                //过滤出当前节点的下一级子节点
                .filter(subNodeTree -> subNodeTree.getPid().equals(nodeTree.getId()))
                //递归查找
                .map(subNodeTree -> covert(subNodeTree, nodeTreeList)).collect(Collectors.toList());
        nodeTree.setChildren(children);
        return nodeTree;
    }
}
@Data
@NoArgsConstructor
class NodeTree {
    //名称
    String name;
    //id
    Integer id;
    //父id
    Integer pid;
    //子节点
    List<NodeTree> children;

    public NodeTree(String name, Integer id, Integer pid) {
        this.name = name;
        this.id = id;
        this.pid = pid;
    }
}
  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原飞木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值