目录
十二、MyBatis的高级映射及延迟加载
12.1多对一
级联属性映射
association
分步查询
12.2多对一延迟加载
12.3一对多
collection
分步查询
12.4一对多延迟加载
多种方式,常见的三种方式:
第一种方式:一条SQL语句,级联属性映射。
第二种方式:一条SQL语句,association。
第三种方式:两条SQL语句,分布查询(常用)。
优点:可复用、支持懒加载。
pojo类Student种添加一个属性:Clazz clazz;表示学生关联的班级对象。
public class Student {
private Integer sid;
private String sname;
private Clazz clazz;
}
StudentMapper
/**
* 根据id获取学生信息。同时获取学生关联的班级信息。
* @param id 学生的id
* @return 学生对象,但是学生对象当中含有班级对象。
*/
Student selectById(Integer id);
StudentMapper.xml
其它位置都不需要改,只需要修改resultMap中的配置:association即可。
StudentMapper.xml
学生对象关联一个班级对象。
property:提供要映射的POJO类的属性名。
javaType:用来指定要映射的java类型
StudentMapper
Student selectByIdStep1(Integer sid);
StudentMapper.xml
association中select位置填写sqlId。sqlId=namespace+id。
ClazzMapper
Clazz selectByIdStep2(Integer cid);
ClazzMapper.xml
分步优点:
代码复用性增强:大步骤拆分成多个小步骤,每一个小步骤可以重复利用。
支持延迟加载(懒加载):暂时访问不到的数据可以先不查询,提高程序的执行效率。
要想支持延迟加载,只需要在association标签中添加fetchType="lazy"即可。
默认情况下是没有开启延迟加载的,需要手动设置。
StudentMapper.xml
在实际开发中,大部分都是需要延迟加载的,所以建议开启全部的延迟加载机制。在myabtis核心配置文件中配置如下:
如果某一项不需要使用延迟加载,在不需要的association标签中设置fetchType="eager".
一对多的实现通常是在一的一方有List集合属性。
在Clazz类中添加List
public class Clazz {
private Integer cid;
private String cname;
private List stus;
// set get⽅法
// 构造⽅法
// toString⽅法
}
第一种方式:collection
第二种方式:分布查询
ClazzMapper接口
Clazz selectByCollection(Integer cid);
ClazzMapper.xml
一对多,这里是collection。
ofType 属性用来指定集合当中的元素类型。
ClazzMapperTest.testSelectByCollection
@Test
public void testSelectByCollection() {
SqlSession sqlSession = SqlSessionUtil.openSession();
ClazzMapper mapper = sqlSession.getMapper(ClazzMapper.class);
Clazz clazz = mapper.selectByCollection(1000);
System.out.println(clazz);
sqlSession.commit();
sqlSession.close();
}
ClazzMapper接口
Clazz selectByStep1(Integer cid);
ClazzMapper.xml
开启延迟加载。
StudentMapper接口
Student selectByStep2(Integer sid);
StudentMapper.xml
执行结果
一对多延迟加载机制和多对一是一样的。
第一种:fetchType="lazy"
第二种:修改全局的配置setting,lazyLoadingEnabled=true,如果开启全局延迟加载后想让某个sql不使用延迟加载:fetchType="eager"