关联查询首先是表与表之间存在某种潜在的关系才会进行的一种查询操作,
一对一的关联查询:
员工--部门,
一对多的关联查询
部门--员工,
应用场景:
在查询员工时需要查找出员工所在的部门的信息(一对一的查询),在查询部门的时候需要查询出部门下所有的员工(一对多)
关联查询:
一对一:
1.sql语句使用表连接,
映射结果使用嵌套结果集, 是使用级联的方式来映射结果的
2.sql语句使用表连接,
映射结果使用association
3.分步查询:
先查员工表, 然后把员工表中的记录的某一列(部门id)
作为参数, 再去查另一张表(部门表)
1.通过员工id查询员工信息
2.将员工信息中的 部门id字段 作为参数 去查部门信息
3.让他们关联起来: association
分步查询实现懒加载:
为什么需要懒加载?
节约资源,减少数据库的压力, 节约内存默认情况没有懒加载
需要配置
在mybatis-config.xml中配置懒加载
参考mybatis官方文档: settings
<!-- 开启分布关联查询懒加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
当使用分步查询, 一个对象关联了另一个对象
只要显示获取关联对象, 才会去执行第二条sql语句
表连接查询
两种映射方式:
嵌套结果集,使用级联属性映射
<resultMap type="EmployeeVo" id="empWithDept1">
<!-- 这里是员工表 -->
<id column="emp_id" property="id"/>
<result column="emp_name" property="name"/>
<result column="emp_email" property="email"/>
<result column="dept_id" property="deptId"/>
<!-- 这里是部门表的字段信息 -->
<result column="did" property="department.deptId"/>
<result column="dept_name" property="department.deptName"/>
</resultMap>
嵌套结果集,使用association 和collection标签来映射
分步查询(拆成两个单表查询, sql语句不存在连接的)
用第一条sql语句查询出的结果中的某个字段作为参数
去执行第二条sql
然后通过 association 或者 collection 将两个对象关联起来
association (一对一)
property: vo当中引用的另一个对象的属性名
column: 要传递给第二条sql的参数(可以传多个参数)
select: 要执行的第二条sql语句的唯一标志符 (namespace + sql的id)
javaType: 关联对象 所对应的java bean 的类型
collection (一对多)
property: vo当中引用的另一个对象的属性名
column: 要传递给第二条sql的参数(可以传多个参数)
select: 要执行的第二条sql语句的唯一标志符 (namespace + sql的id)
ofType: 所持有的集合 属性 的泛型
懒加载(推荐使用)
默认是关闭的
需要到myabtis-config.xml中开启
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>