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属性上,直至为空结束查询返回数据