需求简介:

有3张表,部门 ---->组织 ---->员工,一个部门包含多个组织,每个组织下有多名员工,现在需要根据部门ID查询某个部门下的所有组织,以及每个组织下的所有员工信息,返回的是一个树形结构数据。

一、表结构

1.部门表
CREATE TABLE `department` (`id` int NOT NULL,`dept_name` varchar(255) DEFAULT NULL,`dept_location` varchar(255) DEFAULT NULL,`tenant_id` int DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;2.组织表
CREATE TABLE `groups` (`id` int NOT NULL,`group_name` varchar(255) DEFAULT NULL,`dept_id` int NOT NULL,`tenant_id` int DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;3.员工表
CREATE TABLE `employee` (`id` int NOT NULL,`employee_name` varchar(255) DEFAULT NULL,`group_id` int NOT NULL,`tenant_id` int DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

二、实体类

1.部门@Data
@TableName("department")
public class Department {private Integer id;private String deptName;private String deptLocation;private List<Groups> groupList;
}
2.组织@Data
@TableName("groups")
public class Groups {private Integer id;private String groupName;private List<Employee> employeeList;
}3.员工
@Data
@TableName("employee")
public class Employee {private Integer id;private String employeeName;
}

三、查询方法

//根据部门ID查询
@Mapper
public interface DepartmentMapper extends BaseMapper<Department> {List<Department> testMybatis(@Param("id") Integer id);
}

四、mapper.xml,sql有两种写法,查询结果是一样的
第一种:

<resultMap type="com.entity.Department" id="departmentMap"><id property="id" column="id"/><result property="deptName" column="dept_name"/><result property="deptLocation" column="dept_location"/><collection property="groupList" ofType="com.entity.Groups"javaType="ArrayList" column="id" select="selectGroup"/></resultMap><resultMap type="com.entity.Groups" id="groupMap"><id property="id" column="id"/><result property="groupName" column="group_name"/><collection property="employeeList" ofType="com.entity.Employee"javaType="ArrayList" column="id" select="selectEmployee"/></resultMap><resultMap type="com.entity.Employee" id="employeeMap"><id property="id" column="id"/><result property="employeeName" column="employee_name"/></resultMap><select id="testMybatis" resultMap="departmentMap">SELECTa.id,a.dept_name,a.dept_locationFROMdepartment aWHERE a.id = #{id}</select><select id="selectGroup" resultMap="groupMap">SELECTb.id,b.group_nameFROM`groups` bWHEREb.dept_id = #{id}</select><select id="selectEmployee" resultMap="employeeMap">SELECTc.id,c.employee_nameFROMemployee cWHEREc.group_id = #{id}</select>

第二种:

<resultMap id="departmentMap" type="com.entity.Department"><id property="id" column="id"/><result column="dept_name" jdbcType="VARCHAR" property="deptName"/><result column="dept_location" jdbcType="VARCHAR" property="deptLocation"/><collection property="groupList" ofType="com.entity.Groups"><id property="id" column="gid"/><result column="group_name" property="groupName"/><collection property="employeeList" ofType="com.entity.Employee"><id property="id" column="eid"/><result column="employee_name" property="employeeName"/></collection></collection></resultMap><select id="testMybatis" resultMap="departmentMap">SELECTa.id,a.dept_name,a.dept_location,b.id as gid,b.group_name,c.id as eid,c.employee_nameFROM department aLEFT JOIN `groups` b ON a.id = b.dept_idLEFT JOIN `employee` c ON b.id = c.group_idWHERE a.id = #{id}</select>

五、查询结果

备注:
关于查询sql的写法,第一种定义了3个resultMap,对应3个单表查询sql,比较容易理解,条理关系清晰,但是代码比较多。第二种代码量少一些,采用多表关联查询,只有一个resultMap,可以根据实际情况来选择使用哪种方式。至于两者性能,还没研究过,有空再补。

mybatis一对多的查询的两种方式相关推荐

  1. mybatis一对多查询的两种方式

    user 和order 对象 package com.itheima.mybatis.pojo;import java.io.Serializable; import java.util.Date;p ...

  2. Mybatis关联查询的两种方式

    首先要了解对象的三种关联方式 *数据库表的关联关系有三种,一对一,一对多,多对多 一对一   是通过在任意一方的主键,引入对方主键作为外键来实现的,就是说主键与外键为同一字段 一对多   是通过在&q ...

  3. SpringBoot+MyBatis 基于xml实现多表查询的两种方式

    1.创建SpringBoot项目,导入依赖 <dependencies><dependency><groupId>org.springframework.boot& ...

  4. redis优化查询的两种方式

    前言 一般来说,查询成为很多应用对外的性能瓶颈,其主要原因在于一旦并发量上来了,应用后台和数据库或者其他的存储服务的IO交互次数增多了,而服务器的线程资源开销是有限的,如何减少IO次数,这是优化要考虑 ...

  5. es查询所欲_elasticsearch之查询的两种方式

    前言 简单的没挑战,来点复杂的,比如查看来自顾家的都有哪些人怎么查呢?elasticsearch提供两种查询方式: 查询字符串(query string),简单查询,就像是像传递URL参数一样去传递查 ...

  6. JPA踩坑笔记(一) - 数据查询的两种方式

    本文介绍一下JPA常见的两种查询方式. 注:数据库为Oracle 1.前置准备 1.引入jar包 使用JPA,首先引入jar包,一个是JPA,另一个是数据库驱动,我使用的是Oracle数据库. < ...

  7. mybatis一对一联表查询的两种常见方式

    1.一条语句执行查询(代码如下图)  注释:class表(c别名),teacher表(t别名)teacher_id为class表的字段t_id为teacher表的字段,因为两者有主键关联的原因,c_i ...

  8. mybitis实现增,删,改,查,模糊查询的两种方式:(2)

    方式二:mapper代理接口方式 这种方式只需要xml+接口(不用写实体类)但是需要符合三个规范 使用mapper'代理接口方式 在同一目录下(可以创建一个源文件夹,达到类文件和xml文件分类的作用) ...

  9. Spring Boot 整合 MyBatis Plus实现多数据源的两种方式

    第一种:使用配置类的方式: 项目结构 xml依赖: <?xml version="1.0" encoding="UTF-8"?> <proje ...

最新文章

  1. Linq基础知识小记二
  2. window 获取进程运行长
  3. 7-2 然后是几点 (C语言)
  4. 软件配置管理七重境界
  5. 使用grep4j轻松测试分布式组件上的SLA
  6. 深度学习“炼丹”难?三分钟带你了解国产丹炉旷视天元
  7. docker mysql 日志_在docker mysql容器中启用日志记录
  8. 今明两场直播丨openGauss和MogDB的优化分享;为什么学习 PostgreSQL 是当下不二之选...
  9. TripleDES加解密Java、C#、php通用代码
  10. 记录——《C Primer Plus (第五版)》第十章编程练习第五题
  11. linux系统管理考试试题及答案,Linux系统管理一测试题-附答案
  12. [debug] Expected to have finished reduction in the prior iteration before starting a new one.
  13. 电脑开机一会就蓝屏怎么回事_电脑使用过程中会蓝屏,老板三分钟做系统:硬盘坏了,四百换好!...
  14. 自定义django表单
  15. MySQL Order By 使用方法
  16. “黑暗潜伏者” -- 手机病毒新型攻击方式
  17. linux认证ppt的图片,linux用户、组和身份认证-课件(PPT-精).ppt
  18. android 进程通信
  19. android自动修音,唱吧自动一键修音软件-唱吧自动修音app8.8.6 安卓手机版-东坡下载...
  20. 固态硬盘是什么接口_SATA M.2 PCIe?一分钟教你认识固态硬盘接口

热门文章

  1. 计算机主板哪个好,电脑主板要怎么选?大主板真的比小主板好?不懂最好还是看看!...
  2. 阿里巴巴架构师,20页PPT讲透2亿用户的钉钉系统架构实践
  3. SQL Server 2019 的下载安装及后续与Java的连接
  4. 最牛程序员最爱逛的10大编程网站,你知道几个?-卓帆网之美
  5. 分享域名:短链接生成规则
  6. Typecho搭建和美化
  7. 分支类1 7-6 判断体质完整版 (10 分)
  8. 暴力破解Zip 文件
  9. 改进花朵授粉算法的无线传感器网络部署优化(Matlab代码实现)
  10. 人工智能新视界,机器视觉助力物流分拣自动化