当前位置: 首页 > news >正文

一对多,多对一的关系

Dept与Emp多表连接

一、项目概述

本项目实现了部门(Dept)和员工(Emp)之间的多表连接查询,通过MyBatis框架实现一对多和多对一的关系映射。

1 关系说明

  • 一对多:一个部门有多个员工(Dept → Emp)
  • 多对一:多个员工属于一个部门(Emp → Dept)

二、实体类设计

2.1 Dept.java(部门实体类)

package cn.wolfcode.domain;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dept {private Long deptno;        // 部门编号private String dname;       // 部门名称private String loc;         // 部门位置private List<Emp> empList;  // 一对多:一个部门有多个员工
}

2.2 Emp.java(员工实体类)

package cn.wolfcode.domain;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.time.LocalDate;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {private Long empno;         // 员工编号private String ename;       // 员工姓名private String job;         // 员工职位private Long mgr;           // 上级编号private LocalDate hiredate;  // 入职日期private Double sal;         // 工资private Double comm;        // 奖金private Long deptno;       // 部门编号private Dept dept;          // 多对一:一个员工属于一个部门
}

三、MyBatis配置详解

3 DeptMapper.xml(核心映射文件)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wolfcode.mapper.DeptMapper"><!-- 步骤1:定义结果映射 --><resultMap id="deptMap" type="Dept"><!-- 部门主键映射 --><id column="dept_deptno" property="deptno" /><!-- 部门基本属性映射 --><result column="dname" property="dname"/><result column="loc" property="loc"/><!-- 步骤2:一对多关联映射 --><collection property="empList" ofType="cn.wolfcode.domain.Emp"><!-- 员工主键映射 --><id column="empno" property="empno"/><!-- 员工基本属性映射 --><result column="ename" property="ename"/><result column="job" property="job"/><result column="mgr" property="mgr"/><result column="hiredate" property="hiredate"/><result column="sal" property="sal"/><result column="comm" property="comm"/><result column="emp_deptno" property="deptno"/></collection></resultMap><!-- 步骤3:定义SQL片段(可复用) --><sql id="deptColumns">dept.deptno as dept_deptno, dname, loc,empno, ename, job, mgr, hiredate, sal, comm,emp.deptno as emp_deptno</sql><!-- 步骤4:编写多表连接查询 --><select id="findAll" resultMap="deptMap">select <include refid="deptColumns"/>from dept left join emp on dept.deptno=emp.deptno</select>
</mapper>

SQL查询详解

selectdept.deptno as dept_deptno,  -- 部门编号(带别名避免冲突)dname,                       -- 部门名称loc,                         -- 部门位置empno,                       -- 员工编号ename,                       -- 员工姓名job,                         -- 员工职位mgr,                         -- 上级编号hiredate,                    -- 入职日期sal,                         -- 工资comm,                        -- 奖金emp.deptno as emp_deptno      -- 员工的部门编号(带别名)
from dept
left join emp on dept.deptno=emp.deptno  -- 左连接,确保没有员工的部门也能查到

关键点说明

  • left join:左连接,确保即使部门没有员工也能查询到该部门
  • as dept_deptno:为dept表的deptno列添加别名,避免与emp表的deptno冲突
  • as emp_deptno:为emp表的deptno列添加别名,避免与dept表的deptno冲突

四、执行流程详解

步骤1:测试方法调用

@Test
public void test2() throws IOException {List<Dept> deptList = deptMapper.findAll();deptList.stream().forEach(System.out::println);
}

步骤2:Mapper实现类执行

public class DeptMapperImpl implements DeptMapper {@Overridepublic List<Dept> findAll() {// 获取SqlSessionSqlSession sqlSession = MyBatisTool.getSqlSession();try {// 调用映射接口方法List<Dept> deptList = sqlSession.getMapper(DeptMapper.class).findAll();return deptList;} finally {// 关闭SqlSessionMyBatisTool.close(sqlSession);}}
}

步骤3:MyBatis工具类创建SqlSession

public class MyBatisTool {public static SqlSession getSqlSession() {try (InputStream is = Resources.getResourceAsStream("mybatis-config.xml")) {// 创建SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);// 创建SqlSessionreturn factory.openSession();} catch (IOException e) {throw new RuntimeException(e);}}
}

步骤4:MyBatis执行SQL查询

1. 加载mybatis-config.xml配置文件
2. 加载DeptMapper.xml映射文件
3. 根据方法名findAll找到对应的SQL语句
4. 执行SQL:select ... from dept left join emp on dept.deptno=emp.deptno
5. 获取数据库查询结果集

步骤5:MyBatis结果映射

对于查询结果中的每一行数据:
1. 读取dept_deptno列,创建或获取对应的Dept对象
2. 读取dname和loc列,设置到Dept对象
3. 读取empno列,创建Emp对象
4. 读取员工相关列,设置到Emp对象
5. 将Emp对象添加到Dept对象的empList中
6. 重复直到处理完所有行

步骤6:返回结果

返回List<Dept>,每个Dept对象包含:
- deptno: 部门编号
- dname: 部门名称
- loc: 部门位置
- empList: 该部门的所有员工列表
http://www.jsqmd.com/news/313726/

相关文章:

  • ir_cut打开是对应 白色滤光片吗
  • 【收藏必备】AI算法工程师月薪3万起,大厂扩招浪潮下,这份培养计划助你拿下高薪offer
  • 收藏这份大模型转型攻略:非科班也能月薪翻倍,4大核心能力助你弯道超车
  • NAT 超详细详解
  • 收藏必看!后端工程师转行AI大模型开发,这7个技能让你薪资翻倍!附全套学习资料
  • 交钥匙工程:全球化浪潮下的工程总承包模式革新与市场机遇
  • Youtube Faceless变现:多账号变现与防封指南(2026)
  • Thinkphp和Laravel+vue篮球人才球员管理系统vue
  • Thinkphp和Laravel+vue网上选课推荐系统vue前台的设计与实现_w2l3j
  • 大数据领域数据仓库的分布式数据库应用
  • 达索系统 SIMULIA 2026 新功能直通车|Abaqus HPC新功能介绍
  • Thinkphp和Laravel+vue网约车在线打车拼车管理系统
  • 从草图到智能:达索系统CATIA开启工程开发的最新AI能力
  • Thinkphp和Laravel+vue美特超市进销存管理系统_91crh
  • 大数据领域Hive的多级分桶技术解析
  • Thinkphp和Laravel+vue鞍山市职业技术学院图书借阅推荐系统 提醒 _1o9rw
  • Thinkphp和Laravel+《数字图像处理》教学课程网站(作业,视频,论坛交流)vue
  • 数据最小化原则在大数据应用中的实践
  • 从存储到CPU再到手机:一场涨价引发的科技产业链大洗牌,国产芯片要逆袭?
  • Lambda架构在推荐系统中的应用与实现
  • Thinkphp和Laravel+vue病历 Angel医院门诊在线预约挂号系统vue 科室 专家 预约
  • 运行标准:支撑运维商为客户交付可量化运行标准体系
  • 冗余告警:助力集成商为客户交付智能阈值联动告警方案
  • 【电商API】淘宝/天猫拍立淘(按图搜索商品)API 全解析
  • Python Tkinter手搓一个寄存器计算器
  • 【系统分析师】5.7 数据挖掘技术
  • 交换系统评估:支撑IT外包公司为客户交付需求驱动的交换评估方案
  • 1月28号
  • AI大模型应用开发知识体系
  • 数据隐私保护核心技术的系统性梳理——数据脱敏、加密、假名化、去标识化与匿名化的区分