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

记录java学习第一天01-多对一 一对多 查询

多对一、一对多查询笔记

一、项目概述

经典的部门(Dept)与员工(Emp)之间的多对一和一对多关系查询。

二、实体类设计

1. 部门实体(Dept)

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept {private Long deptNo;      // 部门编号private String dname;     // 部门名称private String loc;       // 部门位置// 一对多关系:一个部门包含多个员工private List<Emp> empList;
}

2. 员工实体(Emp)

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {private Long empno;       // 员工编号private String ename;      // 员工姓名private String job;        // 职位private Long mgr;         // 上级编号private Date hiredate;    // 入职日期private Double sal;       // 薪资private Double comm;      // 奖金private Long deptno;      // 部门编号(外键)// 多对一关系:多个员工属于一个部门private Dept dept;
}

三、多对一查询(Emp → Dept)

1. 使用 <association> 标签

场景:查询员工信息时,同时查询该员工所属的部门信息。

实现方式:使用嵌套查询(N+1 查询问题)

<resultMap id="empMap" type="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="deptno" property="deptno"/><!-- 多对一关联:通过 select 属性指定查询部门的方法 --><association property="dept" javaType="cn.wolfcode.domain.Dept"select="cn.wolfcode.mapper.DeptMapper.selectById" column="deptno"></association>
</resultMap><select id="findAll" resultMap="empMap">select empno,ename,job,mgr,hiredate,sal,comm,emp.deptno,dept.deptno as dno,dname,locfrom emp left join dept on emp.deptno = dept.deptno
</select>

关键点说明

  • property:指定 Emp 类中的属性名(dept)
  • javaType:指定关联对象的类型
  • select:指定另一个 Mapper 中的查询方法(会触发额外的查询)
  • column:将当前查询的 deptno 列作为参数传递给 select 查询

四、一对多查询(Dept → Emp)

1. 使用 <collection> 标签

场景:查询部门信息时,同时查询该部门下的所有员工列表。

实现方式:使用左外连接 + 复用 resultMap

<resultMap id="deptMap" type="Dept"><id column="dno" property="deptNo"/><result column="dname" property="dname"/><result column="loc" property="loc"/><!-- 一对多关联:使用 collection 标签 --><collection property="empList" ofType="cn.wolfcode.domain.Emp"resultMap="cn.wolfcode.mapper.EmpMapper.empMap1"></collection>
</resultMap><!-- 定义可复用的员工映射 -->
<resultMap id="empMap1" type="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="deptno" property="deptno"/>
</resultMap><select id="findAll" resultMap="deptMap">select dept.deptno as dno, dname, loc, empno, ename, job, mgr, hiredate, sal, comm, emp.deptnofrom dept left join emp on dept.deptno = emp.deptno
</select>

关键点说明

  • property:指定 Dept 类中的属性名(empList)
  • ofType:指定集合中元素的类型(Emp)
  • resultMap:复用另一个 Mapper 中定义的 resultMap
  • 使用左外连接确保即使部门没有员工也能查询到部门信息

五、测试代码

1. 多对一查询测试

@Test
public void test() {// 查询全部员工信息(包含部门信息)List<Emp> empList = empMapper.findAll();empList.stream().forEach(System.out::println);
}

输出示例

Emp(empno=7369, ename=SMITH, job=CLERK, mgr=7902, hiredate=..., sal=800.0, comm=null, deptno=20, dept=Dept(deptNo=20, dname=RESEARCH, loc=DALLAS, empList=null))

2. 一对多查询测试

@Test
public void test2() {// 查询全部部门信息(包含员工列表)List<Dept> deptList = deptMapper.findAll();deptList.stream().forEach(System.out::println);
}

输出示例

Dept(deptNo=20, dname=RESEARCH, loc=DALLAS, empList=[Emp(...), Emp(...), ...])

六、核心知识点总结

1. <association> 标签(多对一)

  • 用途:处理"多"方关联"一"方的关系
  • 属性
    • property:Java 实体类中的属性名
    • javaType:关联对象的完整类名
    • select:指定嵌套查询的 statement ID
    • column:传递给嵌套查询的列名
  • 适用场景:查询员工时需要获取部门信息

2. <collection> 标签(一对多)

  • 用途:处理"一"方关联"多"方的关系
  • 属性
    • property:Java 实体类中的集合属性名
    • ofType:集合中元素的类型
    • resultMap:复用已定义的 resultMap
  • 适用场景:查询部门时需要获取员工列表

3. resultMap 复用

  • 通过 resultMap="命名空间.resultMapId" 可以跨 Mapper 复用映射配置
  • 本例中 DeptMapper.xml 复用了 EmpMapper.xml 中的 empMap1

4. SQL 片段复用

<sql id="deptColumns">dept.deptno as dno, dname, loc, empno, ename, job, mgr, hiredate, sal, comm, emp.deptno
</sql><select id="findAll" resultMap="deptMap">select <include refid="deptColumns"/>from dept left join emp on dept.deptno = emp.deptno
</select>
http://www.jsqmd.com/news/313743/

相关文章:

  • 我用GitHub Actions实现“测试用例自动清理”
  • 【TF-A与u-boot烧录的SD卡的操作流程】
  • Java中读写锁的应用场景是什么?
  • Claude:开启AI原生应用领域新时代
  • 【收藏必备】让RAG系统拥有记忆和智能:从“无头苍蝇“到“专业顾问“的进化之路
  • 基于multisim的信号变换放大器的设计与实现
  • 【linux内核】一级页 二级页
  • 【linux】零拷贝技术
  • 阿里云上使用docker-compose安装禅道
  • 2026年Agent效率优化技术全景总结:从记忆、工具到规划的三大核心组件,建议收藏!
  • 为什么做游戏一定要选定制开发?
  • 函数模板
  • 尼帕病毒(Nipah virus)是什么?从RNA结构到实验室研究技术详解
  • 226_尚硅谷_家庭收支记账项目介绍
  • wqs 二分入门
  • 二项式反演
  • 一对多,多对一的关系
  • 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能力