#1.Mybatis多表查询
①原生级联查询+VO对象:
VO:View Object:视图对象
定义:也是实体类的一种,专门用于级联查询的跨表字段保存操作,不与任何一张单表对应,但是可以用来存储多表字段数据
VO中携带着跨表查询之后所有表中字段对应的对象属性。
VO的定义方式:
1.将多个数据表中所有字段对应的实体类对象属性复制到同一个VO类型中;
2.使用继承的方式,继承自多个数据库表对应的多种实体类中的一种,将其他实体类下的对象属性复制到VO当中。
②原生级联查询+级联对象:
级联对象:将外键属性扩展为级联属性的实体类对象,称之为级联对象
级联属性:用来存储级联查询之后,另外一张数据表信息的属性,相当于外键属性的一种扩展
1.<resultMap>标签用法1:映射自定义SQL字段和实体类对象属性的对应关系:
<!--
type:和select标签下的resultType属性作用相似
都用来声明映射结束后,用来存储数据信息的实体类类型
-->
<resultMap id="map1" type="emp2">
<!--
给主键属性使用,用来映射SQL语句中的主键字段和实体类中的主键属性的对应关系
property:用来标记实体类中属性的名称
column:用来标记SQL语句中字段的名称
-->
<id property="" column="" />
</resultMap>
2.<resultMap>标签用法2:将级联查询结果映射到级联对象的级联属性中:
<resultMap id="map1" type="emp2">
<!--
association:该标签用于查询一的一端的数据
多的一端的数据使用的标签是:collection
javaType:对应级联对象中级联属性的数据类型
property:对应级联对象中级联属性的属性名
-->
<association javaType="dept" property="ddd">
<id column=" " property=" "/>
<result column=" " property=" "/>
</association>
</resultMap>
③分步骤查询+级联对象
<resultMap id="empDeptMap2" type="emp2">
<!--
property:依然用来指定当前级联对象中,哪一个属性是级联属性
select:namespace.方法名,用来指定分步骤查询的下一步调用的是哪一个查询方法
column:在第一步查询的结果中,我们使用哪一个字段(外键字段)作为第二步骤查询
-->
<association
property="dept"
select="com.huade.mapper.DeptMapper.queryDeptById"
column="dept_id">
</association>
</resultMap>
<select id="queryEmpByIdWithDept3" resultMap="empDeptMap2">
select * from Emp where emp_id = #{empId}
</select>