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树形结构查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中的关键字volatile详解

    Java中的关键字volatile详解

    这篇文章主要介绍了Java中的关键字volatile,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • SpringBoot框架如何管理Xml和CSV

    SpringBoot框架如何管理Xml和CSV

    XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言。CSV是一种通用的、相对简单的文件格式,通常被用在大数据领域,进行大规模的数据搬运操作,本文将介绍SpringBoot框架如何管理Xml和CSV
    2021-06-06
  • Dubbo RPC接口的参数校验过程

    Dubbo RPC接口的参数校验过程

    文章介绍了在服务A调用服务B时,如何通过添加validation="true"实现参数校验,包括在pom文件、配置文件或注解@Reference中设置,并说明服务B的接口DTO可嵌套校验,需使用@Valid和@Validated
    2025-10-10
  • IDEA maven compile报错OutOfMemoryError(内存溢出)解决及jvm分析

    IDEA maven compile报错OutOfMemoryError(内存溢出)解决及jvm分析

    遇到Maven编译时报OutOfMemoryError错误通常因为默认的堆内存大小不足,本文就来介绍一下OutOfMemoryError(内存溢出)解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-10-10
  • 浅谈spring中scope作用域

    浅谈spring中scope作用域

    这篇文章主要介绍了浅谈spring中scope作用域,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • java运行shell脚本方法示例

    java运行shell脚本方法示例

    利用Runtime.execute方法,我们可以在Java程序中运行Linux的Shell脚本,或者执行其他程序
    2013-12-12
  • Java不指定长度的二维数组实例

    Java不指定长度的二维数组实例

    今天小编就为大家分享一篇Java不指定长度的二维数组实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • IDEA无法创建JDK1.8版本的Springboot项目问题解决(2种方法)

    IDEA无法创建JDK1.8版本的Springboot项目问题解决(2种方法)

    本文主要介绍了IDEA无法创建JDK1.8版本的Springboot项目问题解决,包含两种解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • spring和Mybatis逆向工程的实现

    spring和Mybatis逆向工程的实现

    本文主要介绍了使用Spring和MyBatis进行逆向工程,帮助开发者自动生成数据库相关的代码,提高开发效率和代码质量,具有一定的参考价值,感兴趣的可以了解一下
    2025-07-07
  • SpringAOP四种通知类型+环绕通知说明

    SpringAOP四种通知类型+环绕通知说明

    这篇文章主要介绍了SpringAOP四种通知类型+环绕通知说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论