collection
分步查询:先根据部门id
查询到Department
,然后再根据部门id
查出Employee
表中的所有员工
在接口DepartmentMapper.java
中定义方法:
public Department getDeptByIdStep(Integer id);
还要在接口EmployeeMapperPlus.java
写一个根据部门id
查出Employee
表中的所有员工的方法:
public List<Employee> getEmpsByDeptId(Integer deptId);
然后在EmployeeMapperPlus.xml
中实现getEmpsByDeptId
方法:
<!--
public List<Employee> getEmpsByDeptId(Integer deptId);
resultType:返回值写集合中的Employee类型
-->
<select id="getEmpsByDeptId" resultType="com.atguigu.mybatis.bean.Employee">
select * from tbl_employee where d_id=#{deptId}
</select>
最后可以在DepartmentMapper.xml
中实现:
<!-- collection:分段查询 -->
<resultMap type="com.atguigu.mybatis.bean.Department" id="MyDeptStep">
<!-- property:对应类中的属性 -->
<id column="id" property="id"/>
<id column="dept_name" property="departmentName"/>
<collection property="emps"
select="com.atguigu.mybatis.dao.EmployeeMapperPlus.getEmpsByDeptId"
column="id"></collection>
</resultMap>
<!-- public Department getDeptByIdStep(Integer id); -->
<select id="getDeptByIdStep" resultMap="MyDeptStep">
select id,dept_name from tbl_dept where id=#{id}
</select>
测试:
@Test
public void test06() throws IOException{
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try{
DepartmentMapper mapper = openSession.getMapper(DepartmentMapper.class);
Department deptByIdStep = mapper.getDeptByIdStep(1);
System.out.println(deptByIdStep.getDepartmentName());
System.out.println(deptByIdStep.getEmps());
}finally{
openSession.close();
}
}
因为之前我们在mybatis-config.xml
中设置了,所以这里collection
分步查询延迟加载和按需加载也是有用的
<!--显示的指定每个我们需要更改的配置的值,即使他是默认的。防止版本更新带来的问题 -->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>