MyBatis-延迟加载

2022-09-14 21:27:18 浏览数 (1)

1、延迟加载概述

1.1、什么是延迟加载

就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载。

比如:实际开发过程中很多时候我们并不需要总是在加载班级信息时就一定要加载他的学生信息。此时就是我们所说的延迟加载

1.2、延迟加载优缺点

优点

先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

缺点

因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。

2、延迟加载(一对一)

2.1、需求分析

完成学生表与班级表的一对一的关系,查询出学生的信息和班级信息,班级信息只有在需要的时候才会显示。

2.2、修改IStudentsDao.java文件

代码语言:javascript复制
import com.tyschool.mb005.javabean.Students;
import java.util.List;

public interface IStudentsDao {
    List<Students> findAll2();
}

2.3、修改Students.java文件

代码语言:javascript复制
private Classes classes;

public Classes getClasses() {
        return classes;
}
public void setClasses(Classes classes) {
        this.classes = classes;
}

2.4、修改IStudentsDao.xml文件

代码语言:javascript复制
<resultMap id="studentsMap1" type="Students">
<id column="sid" property="sid"></id>
<result column="sname" property="sname"></result>
<result column="ssex" property="ssex"></result>
<result column="sage" property="sage"></result>
<result column="c_id" property="cid"></result>
<association property="classes" javaType="Classes" select="com.tyschool.mb005.students.dao.IClassesDao.findById" column="c_id"></association>
</resultMap>

<select id="findAll2" resultMap="studentsMap1">
        select sid,sname,ssex,sage,cid as c_id from students
</select>

注意:

select: 填写我们要调用的 select 映射的 id

column : 填写我们要传递给 select 映射的参数

如果没有findByID方法,要去IClassesDao里加入,并书写相应的配置文件

代码语言:javascript复制
import com.tyschool.mb005.javabean.Classes;

import java.util.List;
public interface IClassesDao {
    Classes findById(int cid);
}
代码语言:javascript复制
<select id="findById" resultType="Classes" parameterType="int">
        select * from classes where cid=#{cid};
</select>

2.5、修改SqlMapConfig.xml文件

代码语言:javascript复制
<settings>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

lazyLoadingEnabled: 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。默认为true

aggressiveLazyLoading: 当开启时,任何方法的调用都会加载该对象的所有属性。 否则,每个属性会按需加载,说白了就是aggressiveLazyLoading=true,则lazy load等于没用,所以要使用lazy load还是将其设为false

2.6、修改测试类

代码语言:javascript复制
@Test
public void findAll2(){
List<Students> list=studentsDao.findAll2();
for(Students s:list){
            //System.out.println(s);
            System.out.println(s ":" s.getClasses());
}
}

3、延迟加载(一对多)

3.1、需求分析

完成班级表与学生表的一对多的关系,查询出班级的信息和学生信息,学生信息只有在需要的时候才会显示。

3.2、修改IClassesDao.java文件

代码语言:javascript复制
import com.tyschool.mb005.javabean.Classes;

import java.util.List;

public interface IClassesDao {
    List<Classes> findAll1();
}

3.3、修改Classes.java文件

代码语言:javascript复制
private List<StudentsNew> students;

public List<StudentsNew> getStudents() {
        return students;
}
public void setStudents(List<StudentsNew> students) {
        this.students = students;
}

3.4、修改IClassesDao.xml文件

代码语言:javascript复制
<resultMap id="classesMap1" type="Classes">
<id column="cid" property="cid"></id>
<result column="cname" property="cname"></result>
<collection property="students" ofType="StudentsNew"
                   select="com.tyschool.mb005.students.dao.IStudentsDao.findById" column="cid">
</collection>
</resultMap>

<select id="findAll1" resultMap="classesMap1">
          select * from classes
</select>

3.5、修改IStudentsDao.xml文件

代码语言:javascript复制
<select id="findById" resultType="StudentsNew" parameterType="int">
        select * from students where cid=#{cid};
</select>

3.6、修改测试类

代码语言:javascript复制
@Test
public void findAll1(){
        List<Classes> list=classesDao.findAll1();
        for(Classes c:list){
            System.out.println(c ":" c.getStudents());
        }
}

0 人点赞