Mybatis树结构查询

先看基础数据和代码

1、表的结构

CREATE TABLE `my_tree` (
  `id` varchar(32) NOT NULL,
  `gjfl_name` varchar(100) DEFAULT NULL,
  `parent_id` varchar(32) DEFAULT NULL,
  `gjfl_level` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

2、表数据

INSERT INTO `my_tree` VALUES ('1', '1', '0', '1');
INSERT INTO `my_tree` VALUES ('2', '2', '1', '2');
INSERT INTO `my_tree` VALUES ('3', '3', '0', '1');
INSERT INTO `my_tree` VALUES ('4', '4', '3', '2');
INSERT INTO `my_tree` VALUES ('5', '5', '4', '3');
INSERT INTO `my_tree` VALUES ('6', '6', '2', '3');
INSERT INTO `my_tree` VALUES ('7', '7', '3', '2');

3、实体类

package com.ym.contract.entity.po;

import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.List;

/**
 * @author DC
 * @since 2022-07-25 09:15:48
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("my_tree")
public class MyTree extends Model<MyTree> implements Serializable {
    private static final long serialVersionUID = -96886463332616307L;
    /**
     * 主键id
     */
    @TableId(value = "id",type = IdType.ASSIGN_ID)
    private String id;

    /**
     * 该字段不重要
     */
    private String gjflName;

    /**
     * 父级id
     */
    private String parentId;

    private Integer gjflLevel;
    
    /**
     * 下一级对象集合
     */
    private List<MyTree> childrenList;
}

4、mapper.xml

<resultMap id="rm1" type="com.ym.contract.entity.po.MyTree">
        <result column="id" property="id"/>
        <collection select="findLevel" property="childrenList" column="id" ofType="com.ym.contract.entity.po.MyTree"/>
    resultMap>

    <select id="findLevel" resultMap="rm1">
        select *
        from my_tree
        where parent_id = #{parentId}
    select>
分析

5、关系

首先我们的需求是,查询某一层下的所有子级数据,某一层下的子数据可能有很多条,于是定义了
private List childrenList;
再分析关系,一个父级对应多个子级 一对多关系 ,于是我们使用collection标签

6、查询步骤(重点分析collection标签)

<select id="findLevel" resultMap="rm1">  返回结果集到 id为rm1的resultMap标签中
        select *
        from my_tree
        where parent_id = #{parentId}
    select>


<resultMap id="rm1"
type="com.ym.contract.entity.po.MyTree" 类型是MyTree
> 
        <result 
        column="id" 该名称只是个别名 从property="id"中映射过来 以供collection中的查询语句使用
        property="id" findLevel查询出的对象的属性
        />
        
        <collection select="findLevel"  再次查询
        property="childrenList" 查询出的值赋给mytree对象中的childrenList属性
        column="id" 上边result标签中的 column
        ofType="com.ym.contract.entity.po.MyTree" childrenList是一个MyTree泛型类型的list集合
        /> 
resultMap>

直白的说:当调用findLevel查询时,返回一个结果集到collection中,collection会遍历这个结果集中的id循环去查询,查询出来的数据赋值到childrenList属性上,直至为空结束查询返回数据

你可能感兴趣的:(java,mybatis,java,数据库)