网络运营 > 服务器 > Linux

树形数据结构的级联查询(子查询、递归)

91人参与2021-01-15

树形数据结构的级联查询(子查询、递归)

说明:
当一张表中同时存在id和pid(parent id),我们需要用子连接查出其中的级联关系,并将数据展示为多级列表(树形数据结构),参考以下查询的方法。

1.表结构展示说明

在这里插入图片描述pid是当前行的父节点,这里pid=0是顶级父节点

2.controller代码

    @Autowired
    public CourseTypeServiceImpl courseTypeService;
    /**
     * 查询课程类型的树形结构,多级菜单数据
     * @return
     */
    @GetMapping("/treeData")
    public AjaxResult getTreeData() {
        return courseTypeService.getTreeData();
    }

3.service层代码

    @Override
    public AjaxResult getTreeData() {
    	// 这里使用的是mybatis-plus,basemapper也可以换成对应的CourseTypeMapper
        List<CourseType> courseTypes = baseMapper.selectForTreeData();
        return AjaxResult.me().setResultObj(courseTypes);
    }

4.mapper层代码

public interface CourseTypeMapper extends BaseMapper<CourseType> {
    //查询出课程类型的多级联动表单树形结构,执行的第一条是pid=0 (sql语句中直接写的,这里顶级目录的值为0)
    List<CourseType> selectForTreeData();
}

5.对应的sql语句

注意:
sql语句中引入了一个字段"children",需要在实体类中添加声明这个字段。

	@TableField(exist = false) //当新增表中没有的字段的时候,需要加上这个注解
    private List<CourseType> children;
<mapper namespace="cn.itsource.hb.mapper.CourseTypeMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="cn.itsource.hb.domain.CourseType">
        <id column="id" property="id" />
        <!--嵌套子查询:查询当前分类下的子分类列表 :1037
            下面的sql:cn.itsource.hrm.mapper.CourseTypeMapper.selectByPid 是重点。相当于在查询返回的结果
            是当前map类型时,它会自动将查询出来的每一条数据的column="id"作为查询条件,来执行指定的select语句

            property :对应的 type="cn.itsource.hrm.domain.CourseType"中的属性值。
                    将collection查询出来的结果 ,保存到 CourseType中的指定属性中
            ofType : 当前collection执行之后,返回的集合中的对象类型
            column : 表中的字段的值作为select的查询条件
            select : 当前collection将要执行的sql语句(支持2种传入方式:
                1. Sql语句;
                2. 当前mapper.xml文件中的某一个select的id)
        -->
        <collection property="children"
                    ofType="cn.itsource.hb.domain.CourseType"
                    column="id"
					select="cn.itsource.hb.mapper.CourseTypeMapper.selectByPid" />

    </resultMap>

    <select id="selectByPid" resultMap="BaseResultMap">
        select * from t_course_type where pid = #{pid}
    </select>

    <!-- 查出顶级目录,顶级目录的pid=0,再递归查出各级子目录 -->
    <select id="selectForTreeData" resultMap="BaseResultMap">
        select * from t_course_type where pid = 0
    </select>
</mapper>

6.查出的数据前端展示的效果

一级一级的层级关系如下
在这里插入图片描述

本文地址:https://blog.csdn.net/hubao12321/article/details/112688746

您对本文有任何疑问!!点此进行留言回复

推荐阅读

猜你喜欢

树形数据结构的级联查询(子查询、递归)

01-15

linux下free命令详解

01-15

linux环境下非root用户DB2客户端安装教程

01-14

IBM云对象存储 - Linux主机通过rclone和COS API上传大文件

01-14

Vmware虚拟机搭建Web服务器

01-14

数据取证技术面试题

01-14

拓展阅读

大家都在看

windows10 更新Ubuntu20.04 LTS的方法步骤

06-14

Ubuntu 安装cuda10.1驱动的实现步骤

07-31

详解shell中脚本参数传递的两种方式

11-21

详解shell中脚本参数传递的两种方式

11-21

CentOS7运行.sh脚本提示syntax error: unexpected end of file的解决方法

05-12

shell命令实现当前目录下多个文件合并为一个文件的方法

03-19

Linux查找处理文件名后包含空格的文件(两种方法)

11-25

Apache FlinkCEP 实现超时状态监控的步骤详解

03-09

热门评论