SpringBoot、mybatis返回树结构的数据

公司有个业务需要查出所有的课程分类,并将最后一层类别所包含的课查出来。

image-20220225211048126

数据库说明,有一个parent_id 字段是最好的:

image-20220225211845304

parent_id的值就是上级的id,一般的话,最顶级的parent_id是设置为0

1.实体类

课程分类:

public class CourseType extends BaseEntity
{

    /** 主键 */
    private Long id;

    /** 类别名称 */
    private String name;
 }

课程类:

public class Curriculum extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** 主键 */
    private Long id;

    /** 课程类别 */
    private Long courseType;

    /** 章节数 */
    private Long chapterNum;

    /** 课程封面图 */
    private String imgUrl;

    /** 级别 */
    private Integer level;

    /** 课程名称 */
    private String name;

    /** 课程介绍 */
    private String introduce;
}

2.涉及的视图VO类

类名不规范 🤒,不要在意

我们需要在类中添加List children,元素类型为该类本身的list

这样套娃就能形成树结构

@Data
public class CourseTypeTree {

    private String id;
    private String parentId;
    private String typeName;
    /** 子分类 */
    private List<CourseTypeTree> children;
    /** 子分类所拥有的课程 */
    private List<CurriculumVO> curriculums;
}

3.mapper.xml文件

	<!-- 第一步:---------------------------- -->
	<!-- Mapper层调用的方法,查出所有顶级类别 -->
    <select id="getNodeTree" resultMap="BaseTreeResultMap">
        SELECT
        *
        FROM ty_course_type
        WHERE parent_id = 0
    </select>
	
	<!-- 第二步:---------------------------- -->
	<!-- 通过映射,collection调用查询下一级的方法 -->
	<resultMap id="BaseTreeResultMap" type="com.yangfan.ty.domain.CourseTypeTree">
        <result column="id" property="id"/>
        <result column="parent_id" property="parentId"/>
        <result column="name" property="typeName"/>
        <collection column="id" property="children" javaType="java.util.ArrayList"
                    ofType="com.yangfan.ty.domain.CourseTypeTree" select="getNextNodeTree"/>
    </resultMap>

	<!-- 第三步:---------------------------- -->
	<!-- 用于查询下一级(会循环调用该查询) -->
    <select id="getNextNodeTree" resultMap="NextTreeResultMap">
        SELECT
        *
        FROM ty_course_type
        WHERE parent_id = #{id}
    </select>

	<!-- 第四步:---------------------------- -->
	<!-- 通过映射(达到循环查询),继续调用getNextNodeTree查询下一级,直到没有 -->
	<!-- 如果你只是想查出数的结构,到这里就可以止步了 -->
	<!-- 记号A:----第一个collection是我的业务需求(对应视图的List<CurriculumVO> curriculums),可删除 -->
	<resultMap id="NextTreeResultMap" type="com.yangfan.ty.domain.CourseTypeTree">
        <result column="id" property="id"/>
        <result column="parent_id" property="parentId"/>
        <result column="name" property="typeName"/>
        <collection column="id" property="curriculums" javaType="java.util.ArrayList"
                    ofType="com.yangfan.ty.domain.vo.CurriculumVO" select="getCurriculumByType"/>
        <collection column="id" property="children" javaType="java.util.ArrayList"
                    ofType="com.yangfan.ty.domain.CourseTypeTree" select="getNextNodeTree"/>
    </resultMap>

	<!-- 第五步:------------------以下均为业务拓展---- -->
	<!-- 执行其它业务查询,如第四步的记号A所诉 -->
	<!-- 查询子分类所拥有的课程 -->
	<select id="getCurriculumByType" resultMap="curriculumMapA">
        select
            *
        from ty_curriculum
        where course_type = #{id}
    </select>

	<!-- 第六步:---------------------------- -->
	<!-- 对查询的结果映射到视图类 -->
	<resultMap id="curriculumMapA" type="com.yangfan.ty.domain.vo.CurriculumVO">
        <id column="id" property="id"/>
        <id column="chapter_num" property="chapterNum"/>
        <id column="name" property="name"/>
        <id column="introduce" property="introduce"/>
        <id column="course_type" property="courseType"/>
        <id column="img_url" property="imgUrl"/>
        <id column="level" property="level"/>
    </resultMap>

效果大概是这样的(children就是下一级,因为数据库没数据所以为null,由于业务更改,顶层的分类单独查询,所以该图没有顶级的数据):

QQ截图20220225184908

当然这只是一种实现方式,正好遇到这样的业务,所以记录一波。

后面有其他解决办法也会即时更新到此文章

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于SpringBootMybatis和Vue的项目结构可以根据具体需求做出调整,但是一般来说,可以参考如下的项目结构: ``` ├── src │ ├── main │ │ ├── java │ │ │ └── com.example.project │ │ │ ├── config // 存放SpringBoot的配置类 │ │ │ ├── controller // 存放Controller层的类 │ │ │ ├── dao // 存放Mybatis的Mapper接口和XML文件 │ │ │ ├── entity // 存放实体类 │ │ │ ├── service // 存放Service层的类 │ │ │ ├── Application.java// SpringBoot应用程序的入口 │ │ │ └── ... │ │ └── resources │ │ ├── mapper // 存放Mybatis的Mapper XML文件 │ │ ├── static // 存放静态资源 │ │ ├── templates // 存放前端模板文件 │ │ ├── application.yml // 存放SpringBoot的配置文件 │ │ └── ... │ └── test // 存放单元测试代码 └── pom.xml // Maven项目依赖文件 ``` 其中,`com.example.project`包下的类是整个项目的核心部分,主要包括了Controller层、Service层、Dao层、Entity层等,用于完成具体的业务逻辑。`config`包下的类是SpringBoot的配置类,用于配置数据库、Redis、拦截器等。`mapper`文件夹下是Mybatis的Mapper XML文件,用于定义与数据库交互的SQL语句。`static`文件夹下是静态资源,如js、css、图片等。`templates`文件夹下是前端模板文件,如HTML、Thymeleaf等。 这只是一个示例的项目结构,实际项目中可以根据需求来做出调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

为了我的架构师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值