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属性,来查询员工信息
测试: