MyBatis树形结构查询的实现示例

 更新时间:2025年11月28日 10:24:03   作者:风树种子  
本文介绍了一种使用MyBatis进行树形结构查询的方法,通过构造临时表和内连接,实现了不同层级数据的一次性查询及映射,感兴趣的可以了解一下

前言

对于树形结构的数据库设计通常是基于继承关系设计的,也就是通过父ID关联来实现的,还有就是基于左右值编码设计。本文以继承关系设计的树形结构来讨论下MyBatis树形结构查询。以深度为二的树为例,要将这种结构的数据查询出来,通常的做法是先查询一级数据,再查询二级数据,然后在程序里组装起来,想了下,其实还可以更简单,不用分开两次,就能将不同级别数据一次性查询映射出来。

1.数据准备

以区域表为例,数据如下

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for area
-- ----------------------------
DROP TABLE IF EXISTS `area`;
CREATE TABLE `area` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'PK',
  `area_name` varchar(50) NOT NULL COMMENT '地区名称',
  `parent_id` int(11) NOT NULL COMMENT '父Id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7668 DEFAULT CHARSET=utf8 COMMENT='地区表';

-- ----------------------------
-- Records of area
-- ----------------------------
INSERT INTO `area` VALUES ('1', '广东省', '0');
INSERT INTO `area` VALUES ('2', '深圳市', '1');
INSERT INTO `area` VALUES ('3', '广州市', '1');
INSERT INTO `area` VALUES ('4', '湖南省', '0');
INSERT INTO `area` VALUES ('5', '长沙市', '4');
INSERT INTO `area` VALUES ('6', '株洲市', '4');

2.实体类

public class Area {
    private Integer id;

    private String areaName;

    private Integer parentId;

    List<Area> children;

   //getter setter
}

3.查询sql

SELECT
        t_top.id AS id1,
        t_top.area_name AS area_name1,
        t_top.parent_id AS parent_id1,
        t_second.id AS id2,
        t_second.area_name AS area_name2,
        t_second.parent_id AS parent_id2
    FROM
        (
            SELECT
                id,
                area_name,
                parent_id
            FROM
                area
            WHERE
                parent_id = 0
        ) AS t_top
    INNER JOIN (
        SELECT
            id,
            area_name,
            parent_id
        FROM
            area
        WHERE
            parent_id IN (
                SELECT
                    id
                FROM
                    area
                WHERE
                    parent_id = 0
            )
    ) AS t_second ON t_top.id = t_second.parent_id

基本思路就是将一级区域查询出来作为临时表t_top,将二级区域查询出来作为临时表t_second,然后将两张表做inner join操作,查询结果:

4.ResultMap映射

  <resultMap id="TreeResultMap" type="com.domain.Area" >
    <id column="id1" property="id" jdbcType="INTEGER" />
    <result column="area_name1" property="areaName" jdbcType="VARCHAR" />
    <result column="parent_id1" property="parentId" jdbcType="INTEGER" />
    <collection property="children" ofType="com.domain.Area">
      <id column="id2" property="id" jdbcType="INTEGER" />
      <result column="area_name2" property="areaName" jdbcType="VARCHAR" />
      <result column="parent_id2" property="parentId" jdbcType="INTEGER" />
    </collection>
  </resultMap>

单元测试结果:

到此这篇关于MyBatis树形结构查询的实现示例的文章就介绍到这了,更多相关MyBatis树形结构查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IntelliJ IDEA安装与基础配置指南

    IntelliJ IDEA安装与基础配置指南

    IntelliJ IDEA是一款由JetBrains公司开发的Java集成开发环境,支持Java、Kotlin、Groovy、Scala等多种编程语言,IntelliJ IDEA作为一款强大的开发工具,被广泛应用于Java开发、Web开发、Android开发等领域,本文给大家介绍了IntelliJ IDEA安装与基础配置
    2025-07-07
  • 解决Idea的选择文件后定位瞄准器"Select Opened File"的功能不见了

    解决Idea的选择文件后定位瞄准器"Select Opened File"的功能

    使用IntelliJ IDEA时,可能会发现"SelectOpenedFile"功能不见了,这个功能允许用户快速定位到当前打开文件的位置,若要找回此功能,只需在IDEA的标题栏上右键,然后选择"Always Select Opened File",这样就可以重新启用这个便捷的功能
    2024-11-11
  • Java11新特性之HttpClient小试牛刀

    Java11新特性之HttpClient小试牛刀

    本文主要研究一下Java11的HttpClient的基本使用。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Java8实现Stream流的合并的方法展示

    Java8实现Stream流的合并的方法展示

    本文介绍了Java8中Stream流的合并方法,包括concat()、flatMap()和reduce()三种方法。其中,concat()方法可以将两个Stream流合并成一个,flatMap()方法可以将一个Stream流中的元素映射成多个Stream流并合并成一个,reduce()方法可以将Stream流中的元素逐个合并成一个结果
    2023-05-05
  • Java网络编程基础教程之Socket入门实例

    Java网络编程基础教程之Socket入门实例

    这篇文章主要介绍了Java网络编程基础教程之Socket入门实例,本文讲解了创建Socket、Socket发送数据、Socket读取数据、关闭Socket等内容,都是最基础的知识点,需要的朋友可以参考下
    2014-09-09
  • Java把多个对象的list的数据合并的方法示例

    Java把多个对象的list的数据合并的方法示例

    在Java中合并多个List可以使用遍历、Stream API或Apache Commons Collections,通过遍历各个List并将元素添加到新List实现合并,Java 8提供了Stream API,使用Stream.of()和flatMap()可以简洁地合并List,文中给出了多种方法示例,需要的朋友可以参考下
    2024-09-09
  • Springboot中登录后关于cookie和session拦截问题的案例分析

    Springboot中登录后关于cookie和session拦截问题的案例分析

    这篇文章主要介绍了Springboot中登录后关于cookie和session拦截案例,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java图片处理的简易指南

    Java图片处理的简易指南

    图像处理是各类应用程序的重要组成部分,Java作为一种多功能且强大的编程语言,提供了丰富的库和框架来高效地处理图像处理任务,本文将带您了解Java图像处理的基本概念、工具以及实践示例,帮助您掌握Java图像处理技术,需要的朋友可以参考下
    2024-09-09
  • Java单例模式简单介绍

    Java单例模式简单介绍

    这篇文章主要为大家详细介绍了Java单例模式简单的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Spring Boot 注解体系与工程实践示例指南

    Spring Boot 注解体系与工程实践示例指南

    本文详细介绍了SpringBoot核心注解的语法、语义、适用场景及组合方式,涵盖了自动配置、条件化注入、AOP与事务等关键领域,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-11-11

最新评论