在我们查数据时,mybatis会默认把关联的数据查出来,而关联查询比单表查询慢,并且我们有时候不需要那么多的数据。所以我们需要开启懒加载,关联的数据等需要的时候再查出来
myBatis开启懒加载,需要在mybatis主配置文件的settings标签中配置lazyLoadingEnabled为true,aggressiveLazyLoading为false。lazyLoadingEnabled=true即开启延迟加载,aggressiveLazyLoading=false即按需加载。
参数 | 描述 | 有效值 | 默认值 |
---|---|---|---|
lazyLoadingEnabled | 延迟加载的全局开关,当他开启时,所有关联的对象都会延迟加载,特定的关联关系可以通过设置fetchType属性来覆盖选项的开关状态 | true,false | false |
aggressiveLazyLoading | 当启用时,当调用对象的任意属性时,如果对象具有懒加载的属性,会把对象完整加载,即把懒加载的属性全部查出来 | true,false | true |
由于我们对lazyLoadingEnable属性的含义比较熟悉,下面我们先单独看这个:
在mybatis主文件中配置:
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
pojo对象层级关系如下:
测试发现,确实属性懒加载了。但是它还是会把相同层级的对象数据也会查出来。这是因为默认aggressiveLazyLoading=true,表示按层级延迟加载。
例如当查询出学生的时候,因为健康情况和关联对象属于同一级别,因此会把健康情况也查出来。
代码:
public void test() throws IOException{
SqlSession sqlSession=null;
try{
sqlSession = SqlSessionFactoryUtil.openSqlSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
MaleStudentBean student = (MaleStudentBean) studentMapper.getStudent(1);
sqlSession.commit();
}finally{
if(sqlSession!=null){
sqlSession.close();
}
}
}
当访问对象的一些字段信息时,还会发生一些“异常情况”:
1.如当访问学生信息的时候,会把学生证和课程成绩查出来
@Test
public void test() throws IOException{
SqlSession sqlSession=null;
try{
sqlSession = SqlSession