mybaits查询树形结构数据(递归)

这篇博客介绍了如何使用MyBatis处理数据库中的树形结构数据查询。通过创建`AbstractEntityTree`实体类和配置mapper文件,实现了根据`entityType`获取所有子级数据的功能。`AbstractEntityTreeMapper`包含两个查询方法:一个用于按`entityType`筛选,另一个用于根据父节点ID获取子节点。结果映射中使用了association来递归加载子节点。

业务中有一张数据库表中存放树形结构数据,查询时,根据EntityType的数据集合,需要查询出其对应的所有子级数据。

其中数据库表结构如下:
在这里插入图片描述

其中AbstractEntityID为id,AbstractEntityParentID为当前数据的父节点id,顶层节点的id为空。

1. entity

首先我们创建数据库表对应的entity,其内容如下:

@Setter
@Getter
public class AbstractEntityTree {

    /**
     * 设备树类型
     */
    private String entityType;

    /**
     * 树结构
     */
    private String entityStructure;

    /**
     * 树id
     */
    private String id;

    /**
     * 父节点id
     */
    private String parentId;

    /**
     * code码
     */
    private String code;

    /**
     * 名
     */
    private String name;

    /**
     * 子节点
     */
    private List<AbstractEntityTree> children;

}

其中children为当前对象自身。

2. mapper

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.xxx.xxx.mapper.common.AbstractEntityTreeMapper">

    <!--AbstractEntityTree实体类与查询出的数据字段的映射-->
    <resultMap id="baseResult" type="com.xxx.xxx.entity.AbstractEntityTree">
        <id property="entityType" column="EntityType"/>
        <id property="entityStructure" column="EntityStructure"/>
        <id property="entityType" column="EntityType"/>
        <id property="name" column="Name"/>
        <id property="code" column="Code"/>
        <id property="id" column="AbstractEntityID"/>
        <id property="parentId" column="AbstractEntityParentID"/>
        <association property="children" select="com.xxx.xxx.mapper.common.AbstractEntityTreeMapper.findTreeByParentId" column="AbstractEntityID" />
    </resultMap>

    <!--根据entityType获取设备树的信息(不传是获取所有的设备树信息)-->
    <select id="findTreeByEntityTypeList" resultMap="baseResult">
        SELECT * FROM AbstractEntityTree
        <if test="entityTypes != null and entityTypes.size > 0">
            WHERE EntityType IN
            <foreach collection="entityTypes" open="(" separator="," close=")" item="entityType">
                #{entityType}
            </foreach>
        </if>
    </select>

    <!--根据父节点id获取子设备树的信息-->
    <select id="findTreeByParentId" resultMap="baseResult">
        SELECT * FROM AbstractEntityTree WHERE AbstractEntityParentID = #{parentId}
    </select>

</mapper>

在这里插入图片描述

### MyBatis 查询关联数据输出配置示例 在 MyBatis 中,查询关联表的数据通常通过 `resultMap` 来实现复杂的映射关系。以下是基于提供的引用内容和专业知识的一个完整解决方案。 #### 使用 resultMap 实现多对多关联查询 假设存在两个实体类:`Course` 和 `Student`,它们之间有多对多的关系。为了查询某个课程下的所有学生信息并正确输出,可以通过以下方式配置: 1. **定义 SQL 映射文件中的 `<resultMap>`** 在 XML 文件中定义一个 `resultMap`,用于描述如何将数据库的结果集映射到 Java 对象上。如果涉及多个对象之间的关联,则需要嵌套映射。 ```xml <resultMap id="courseWithStudentsResultMap" type="com.ssm.entity.Course"> <!-- 主体字段 --> <id property="id" column="course_id"/> <result property="name" column="course_name"/> <!-- 嵌套集合 --> <collection property="students" ofType="com.ssm.entity.Student"> <id property="id" column="student_id"/> <result property="name" column="student_name"/> <result property="age" column="student_age"/> </collection> </resultMap> <select id="findCourseWithStudent" resultMap="courseWithStudentsResultMap"> SELECT c.id AS course_id, c.name AS course_name, s.id AS student_id, s.name AS student_name, s.age AS student_age FROM courses c LEFT JOIN course_student cs ON c.id = cs.course_id LEFT JOIN students s ON cs.student_id = s.id WHERE c.id = #{id} </select> ``` 上述代码片段展示了如何利用 `resultMap` 将课程及其关联的学生列表一起加载出来[^5]。 2. **Java 测试代码调用** 参考提供的测试代码结构,可以在测试类中编写如下逻辑来验证功能是否正常工作: ```java @Test public void findCourseByIdTest() { SqlSession sqlSession = MybatisUtil.getSession(); // 调用 Mapper 方法获取带有关联学生的课程信息 Course course = sqlSession.selectOne("com.ssm.mapper.CourseMapper.findCourseWithStudent", 1); System.out.println(course); // 打印结果以确认关联数据已成功加载 sqlSession.close(); } ``` 此部分代码实现了从会话中提取指定 ID 的课程,并打印该课程所包含的所有学生信息[^3]。 3. **实体类设计** 确保对应的实体类能够支持这种层次化的数据存储形式。例如,`Course` 类应包含一个 `List<Student>` 成员变量表示其所拥有的学生群体;而每个 `Student` 则仅需简单属性即可满足需求。 ```java package com.ssm.entity; import java.util.List; public class Course { private Integer id; private String name; private List<Student> students; // 存储关联的学生列表 // Getters and Setters... } class Student { private Integer id; private String name; private int age; // Getters and Setters... } ``` 以上即为完整的 mybatis 多对多关联查询配置实例说明。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值