本文是自己的学习笔记,主要参考以下资料
- 马士兵教育
- 1、延迟加载
- 2、开启延迟加载
- 2.1、配置信息
- 2.2、查询语法
- 2.2.1、前置条件
- 2.2.2、xml语法
- 2.2.3、总结
1、延迟加载
延迟加载是用于优化一对多或者多对多的查询。
比如员工表和部门表,员工表left join
部门表,一条SQL查出所有数据。
但有时候部门表的使用频率很低,这时候我们就可以使用延迟加载
,先查出员工数据,等需要用到部门数据的时候再执行剩下的查询。
2、开启延迟加载
2.1、配置信息
延迟加载与这两个属性有关。
lazyLoadingEnabled
: ture|false,true开启延迟加载。与aggressiveLoadingEnabled
是相反的属性。aggressiveLoadingEnabled
: ture|false,true开启全加载。与lazyLoadingEnabled
是相反的属性。
在mybatis.xml
中,configuration
标签下这样设置可开启全局延迟加载。
<configuration><settings><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLoadingEnabled" value="false"/></settings>
</configuration>
2.2、查询语法
2.2.1、前置条件
现有两个POJO,Emp--员工,Dept--部门
。两者的类如下,数据库字段同名。
public class Dept {private Integer deptid;private String dname;
}
public class Emp {private Integer id;private String name;private Integer age;private Dept dept;
}
2.2.2、xml语法
现在是查员工表,left join
出部门表。部门数据延迟加载。
我们不能直接使用left join
关联数据,因为数据库语句一执行就会查出所有数据,不会收到lazyLoadingEnabled
的影响。
我们需要将原来的left join
拆成两个查询,然后在配置中关联。这样查询过程就受mybatis
的控制。
需要拆成两个查询一个是查询员工表,另一个是查询部门表。
<select id="queryDeptById">select * from t_dept where deptid = #{deptid}
</select><select id="queryEmp" resultMap="baseMap1">select * from t_emp
</select>
之后定义返回值,也是在这里定义关联关系。
<resultMap id="baseMap" type="emp"><id column="id" property="id"/><result column="name" property="name"/><result column="age" property="age"/><association property="dept" javaType="Dept" column="deptId" select="queryDeptById"><id column="deptid" property="deptid"/><result column="dname" property="dname"/></association>
</resultMap>
2.2.3、总结
<resultMap id="baseMap" type="emp"><id column="id" property="id"/><result column="name" property="name"/><result column="age" property="age"/><association property="dept" javaType="Dept" column="deptId" select="queryDeptById"><id column="deptid" property="deptid"/><result column="dname" property="dname"/></association>
</resultMap><select id="queryDeptById">select * from t_dept where deptid = #{deptid}
</select><select id="queryEmp" resultMap="baseMap1">select * from t_emp
</select>