[000-01-011].第09节:MyBatis的高级映射与延迟加载

我的后端学习大纲

MyBatis学习大纲


1.高级映射中数据库表的准备:

所谓的高级映射就是涉及到了多张数据库中的表,存在一对多,多对1,多对多等关系,在之前都是简单映射,只是涉及到一张表

1.1.搭建环境:

a.新建库表:

  • 一个班级对应多名学生,一个学生只对应一个班级,
    在这里插入图片描述
    在这里插入图片描述

b.建模块等操作:


2.多对一映射情况分析:

2.1.多对一映射情况举例:

  • 1.一个班级对应多个学生,一个学生对应一个班级;多:学生,1:班级
    在这里插入图片描述
  • 2.一个部门可以包含很多员工,一个员工仅仅可以属于一个部门;员工是多,部门是1

2.2.多对一情况下实体类的的说明:

  • 1.解决多对一的话,就在多(Emp)的这个实体类中创建1(Dept)类型的对象,来表示员工对应的部门对象;
    在这里插入图片描述
  • 多(员工)EmpMapper接口中定义:查询员工对应的部门信息的抽象方法:
    在这里插入图片描述

2.3.多对一映射情况的三种解决方法:

  • 1.方式1:一条SQL,级联属性映射
  • 2.方式2:一条SQL语句,association
  • 3.方式3:两条SQL,分步查询(这个常用解决方法,优点支持可复用,支持懒加载

a.方式1:通过级联属性赋值的方式的案例理解:

案例1:

  • 1.接口中定义方法:
    在这里插入图片描述
  • 2.级联操作:
    在这里插入图片描述
  • 3.测试:
    在这里插入图片描述

案例2:

  • 1.更改映射配置文件
    在这里插入图片描述
  • 2.测试 :
    在这里插入图片描述

b.方式2:使用association标签解决,使用javaType属性说明类型:

案例1中的实现:

  • 1.定义接口:
    在这里插入图片描述
  • 2.映射SQL:
    在这里插入图片描述
  • 3.测试:
    在这里插入图片描述

案例2中的实现:

  • 1.映射的SQL:
    在这里插入图片描述
  • 2.测试 :
    在这里插入图片描述

c.方式3:分步查询的方式

案例1中的实现:

  • 1.定义第一步接口,先查询
    在这里插入图片描述

  • 2定义第2步接口:
    在这里插入图片描述

  • 3.映射SQL:
    在这里插入图片描述
    在这里插入图片描述

  • 4.测试:
    在这里插入图片描述
    在这里插入图片描述

案例2中的实现:

  • 1.员工接口中定义方法:先去查询员工所有信息,把员工信息查询出来后再去查询对应的部门名称
    在这里插入图片描述
  • 2.更改SQL映射文件:
<!--Emp getEmpByStep(@Param("eid") int eid);--> 
<select id="getEmpByStep" resultMap="empDeptStepMap"> 
	select * from t_emp where eid = #{eid} 
</select>

在这里插入图片描述

  • 3.在部门的接口中定义查询部门信息的抽象方法: 在这里插入图片描述
  • 4.在deptmapper的SQL映射配置文件中
<!--Dept getEmpDeptByStep(@Param("did") int did);--> 
<select id="getEmpDeptByStep" resultType="Dept"> 	
	select * from t_dept where did = #{did} 
</select>
  • 5.改写emp的映射配置文件:
    • select是设置分布查询的sql的唯一标识mapper接口的全类名.方法名
    • column是设置分布查询的条件
      在这里插入图片描述
  • 6.测试:
    在这里插入图片描述
    在这里插入图片描述

3.MyBatis的延迟加载:

  • 分布查询是从方式三中分布查询方式中而来的,由于分布查询就可以根据配置来实现懒加载

在这里插入图片描述

3.1.分步查询的优点:

  • 1.分步查询可以实现延迟加载,默认是不开启全局加载的,所以需要在核心配置文件中设置全局配置信息
  • 2.设置全局配置信息的关键属性: lazyLoadingEnabled
  • 3.在核心配置文件中设置后,就开启了延迟加载的全局开关。那么所有关联对象都会延迟加载
    在这里插入图片描述
  • 4.虽然开启了全局的延迟加载,但是有些功能不需要延迟加载,那么此时就需要实现立刻加载,根据这种需求的话此时可通过association和collection中的fetchType属性设置当前的分步查询是否使用延迟加载fetchType="lazy(延迟加载)|eager(立即加载)
    在这里插入图片描述

4.MyBatis中的一对多问题解决:

4.1.一对多的情况:

  • 1.一个班级中具有很多学生:
    在这里插入图片描述

  • 2.情况2:一个部门下具有很多的学生,当查询某个部门的所有员工信息,就是一对多的关系

4.2.一对多问题2种解决方式:

  • 1.使用collection标签
  • 2.分布查询方式

a.方式1:使用collection标签:

  • 1.在mybatis中:对1,是对应的对象,对多是对应的集合
  • 2.在Dept接口中添加Emp类型的属性,并添加对应的set和get方法:
    在这里插入图片描述
  • 3.在部门接口文件中定义抽象方法
    在这里插入图片描述
  • 4.编写Dep的映射配置文件
    • collection:处理一对多的映射关系
    • ofType:表示该属性所对应的集合中存储数据的类型
      在这里插入图片描述
  • 5.测试:
    在这里插入图片描述

b.方式2:分布查询方式

步骤

  • 1.查询部门信息:
  • 2.根据部门id查询部门中的所有员工:

实现:

  • 1.部门接口中定义抽象方法:
    在这里插入图片描述
  • 2.在接口的映射文件中书写SQL
    在这里插入图片描述
  • 3.再进行第二步:根据部门的did属性,来查询员工信息
    在这里插入图片描述
    在这里插入图片描述

测试:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值