// 分步查询的优点: 可以实现延迟加载,但是必须在核心配置文件中设置全局配置信息: lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载 aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。 否则,每个属性会按需加载 此时就可以实现按需加载,获取的数据是什么,就只会执行相应的sql。此时可通过association和collection中的fetchType属性设置当前的分步查询是否使用延迟加载,fetchType="lazy(延迟加 载)|eager(立即加载)"
代码示例
//测试实体类
public class ClazzTest {
private Integer id; //班级id
private String clazzName;//班级名称
private List studentList;//班级学生信息
}
@Test
public void testCRUD() throws IOException {
SqlSession sqlSession = getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
//一对多查询,分布查询
//第一步:根据班级id查询班级信息
ClazzTest clazzById = mapper.getClazzById(1);
//当只获取班级信息,则只执行第一步查询
System.out.println("班级信息:"+clazzById.getClazzName());
//当获取班级下的学生信息时,才进行第二步查询
List studentList = clazzById.getStudentList();
studentList.forEach(System.out::println);
}
/**
* 分步查询第一步,根据id查询班级信息
*
* @param id 班级id
*/
ClazzTest getClazzById(@Param("id") Integer id);
SELECT * FROM demo1.clazz c
WHERE id = #{id}
/**
* 分步查询第二步,根据班级id查询班级的学生
*
* @param clazzId 班级id
*/
List getStudentByClazzId(@Param("clazzId") Integer clazzId);
SELECT * FROM demo1.student
WHERE clazzId = #{clazzId}
运行结果
[12:49:23.028] [DEBUG] [main] [com.xyz.mybatis.mapper.StudentMapper.getClazzById] [==> Preparing: SELECT * FROM demo1.clazz c WHERE id = ?]
[12:49:23.063] [DEBUG] [main] [com.xyz.mybatis.mapper.StudentMapper.getClazzById] [==> Parameters: 1(Integer)]
[12:49:23.159] [DEBUG] [main] [com.xyz.mybatis.mapper.StudentMapper.getClazzById] [ Preparing: SELECT * FROM demo1.student WHERE clazzId = ?]
[12:49:23.161] [DEBUG] [main] [com.xyz.mybatis.mapper.StudentMapper.getStudentByClazzId] [==> Parameters: 1(Integer)]
[12:49:23.164] [DEBUG] [main] [com.xyz.mybatis.mapper.StudentMapper.getStudentByClazzId] [ |