目录
一、一对多映射关系的处理
这里一对多是指实体类中某个属性是由许多实体类构成的集合,如部门类中员工属性是一个List集合。
方式一:使用<collection>标签
<resultMap>配置:
<resultMap id="getDeptAndEmpByDeptIdResultMap" type="Dept">
<id column="dept_id" property="deptId"></id>
<result column="dept_name" property="deptName"></result>
<collection property="emps" ofType="Emp">
<id column="emp_id" property="empId"></id>
<result column="emp_name" property="empName"></result>
<result column="age" property="age"></result>
<result column="gender" property="gender"></result>
</collection>
</resultMap>
<select id="getDeptAndEmpByDeptId"
resultMap="getDeptAndEmpByDeptIdResultMap">
select *
from t_dept left join t_emp
on t_dept.dept_id = t_emp.dept_id
where t_dept.dept_id = #{deptId}
</select>
方式二:使用分步查询
<resultMap>配置:
查询部门信息
<resultMap id="getDeptAndEmpByDeptIdResultMap" type="Dept">
<id column="dept_id" property="deptId"></id>
<result column="dept_name" property="deptName"></result>
<collection property="emps"
select="com.liaoxiangqian.mapper.EmpMapper.getEmpByDeptId"
column="dept_id">
</collection>
</resultMap>
<select id="getDeptAndEmpByDeptId"
resultMap="getDeptAndEmpByDeptIdResultMap">
select * from t_dept where dept_id = #{deptId}
</select>
根据部门id查询员工信息
<resultMap id="getEmpByDeptIdResultMap" type="Emp">
<id column="emp_id" property="empId"></id>
<result column="emp_name" property="empName"></result>
<result column="age" property="age"></result>
<result column="gender" property="gender"></result>
</resultMap>
<select id="getEmpByDeptId" resultMap="getEmpByDeptIdResultMap">
select * from t_emp where dept_id = #{deptId}
</select>
二、分步查询的优点
● 分布查询的优点是可以实现延迟加载
● 延迟加载可以避免在分步查询中执行所有的SQL语句,节省资源,实现按需加载
● 需要在核心配置文件中添加如下的配置信息
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
● lazyLoadingEnabled表示全局的延迟加载开关,true表示所有关联对象都会延迟加载,false表示关闭
● aggressiveLazyLoading表示是否加载该对象的所有属性,如果开启则任何方法的调用会加载这个对象的所有属性,如果关闭则是按需加载
● 由于这个配置是在核心配置文件中设定的,所以所有的分步查询都会实现延迟加载,而如果某个查询不需要延迟加载,可以在collection标签或者association标签中的fetchType属性设置是否使用延迟加载,属性值lazy表示延迟加载,属性值eager表示立即加载