mybatis一对多的查询的两种方式
需求简介:
有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一对多的查询的两种方式相关推荐
- mybatis一对多查询的两种方式
user 和order 对象 package com.itheima.mybatis.pojo;import java.io.Serializable; import java.util.Date;p ...
- Mybatis关联查询的两种方式
首先要了解对象的三种关联方式 *数据库表的关联关系有三种,一对一,一对多,多对多 一对一 是通过在任意一方的主键,引入对方主键作为外键来实现的,就是说主键与外键为同一字段 一对多 是通过在&q ...
- SpringBoot+MyBatis 基于xml实现多表查询的两种方式
1.创建SpringBoot项目,导入依赖 <dependencies><dependency><groupId>org.springframework.boot& ...
- redis优化查询的两种方式
前言 一般来说,查询成为很多应用对外的性能瓶颈,其主要原因在于一旦并发量上来了,应用后台和数据库或者其他的存储服务的IO交互次数增多了,而服务器的线程资源开销是有限的,如何减少IO次数,这是优化要考虑 ...
- es查询所欲_elasticsearch之查询的两种方式
前言 简单的没挑战,来点复杂的,比如查看来自顾家的都有哪些人怎么查呢?elasticsearch提供两种查询方式: 查询字符串(query string),简单查询,就像是像传递URL参数一样去传递查 ...
- JPA踩坑笔记(一) - 数据查询的两种方式
本文介绍一下JPA常见的两种查询方式. 注:数据库为Oracle 1.前置准备 1.引入jar包 使用JPA,首先引入jar包,一个是JPA,另一个是数据库驱动,我使用的是Oracle数据库. < ...
- mybatis一对一联表查询的两种常见方式
1.一条语句执行查询(代码如下图) 注释:class表(c别名),teacher表(t别名)teacher_id为class表的字段t_id为teacher表的字段,因为两者有主键关联的原因,c_i ...
- mybitis实现增,删,改,查,模糊查询的两种方式:(2)
方式二:mapper代理接口方式 这种方式只需要xml+接口(不用写实体类)但是需要符合三个规范 使用mapper'代理接口方式 在同一目录下(可以创建一个源文件夹,达到类文件和xml文件分类的作用) ...
- Spring Boot 整合 MyBatis Plus实现多数据源的两种方式
第一种:使用配置类的方式: 项目结构 xml依赖: <?xml version="1.0" encoding="UTF-8"?> <proje ...
最新文章
- Linq基础知识小记二
- window 获取进程运行长
- 7-2 然后是几点 (C语言)
- 软件配置管理七重境界
- 使用grep4j轻松测试分布式组件上的SLA
- 深度学习“炼丹”难?三分钟带你了解国产丹炉旷视天元
- docker mysql 日志_在docker mysql容器中启用日志记录
- 今明两场直播丨openGauss和MogDB的优化分享;为什么学习 PostgreSQL 是当下不二之选...
- TripleDES加解密Java、C#、php通用代码
- 记录——《C Primer Plus (第五版)》第十章编程练习第五题
- linux系统管理考试试题及答案,Linux系统管理一测试题-附答案
- [debug] Expected to have finished reduction in the prior iteration before starting a new one.
- 电脑开机一会就蓝屏怎么回事_电脑使用过程中会蓝屏,老板三分钟做系统:硬盘坏了,四百换好!...
- 自定义django表单
- MySQL Order By 使用方法
- “黑暗潜伏者” -- 手机病毒新型攻击方式
- linux认证ppt的图片,linux用户、组和身份认证-课件(PPT-精).ppt
- android 进程通信
- android自动修音,唱吧自动一键修音软件-唱吧自动修音app8.8.6 安卓手机版-东坡下载...
- 固态硬盘是什么接口_SATA M.2 PCIe?一分钟教你认识固态硬盘接口