当前位置: 代码网 > it编程>编程语言>Java > MyBatis树形结构查询的实现示例

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

2025年11月28日 Java 我要评论
前言对于树形结构的数据库设计通常是基于继承关系设计的,也就是通过父id关联来实现的,还有就是基于左右值编码设计。本文以继承关系设计的树形结构来讨论下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树形结构查询内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com