共计 2968 个字符,预计需要花费 8 分钟才能阅读完成。
1、延迟加载概述
1.1、什么是延迟加载
就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载。
比如:实际开发过程中很多时候我们并不需要总是在加载班级信息时就一定要加载他的学生信息。此时就是我们所说的延迟加载
1.2、延迟加载优缺点
优点
先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
缺点
因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。
2、延迟加载(一对一)
2.1、需求分析
完成学生表与班级表的一对一的关系,查询出学生的信息和班级信息,班级信息只有在需要的时候才会显示。
2.2、修改 IStudentsDao.java 文件
import com.tyschool.mb005.javabean.Students;
import java.util.List;
public interface IStudentsDao {List<Students> findAll2();
}
2.3、修改 Students.java 文件
private Classes classes;
public Classes getClasses() {return classes;
}
public void setClasses(Classes classes) {this.classes = classes;
}
2.4、修改 IStudentsDao.xml 文件
<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 里加入,并书写相应的配置文件
import com.tyschool.mb005.javabean.Classes;
import java.util.List;
public interface IClassesDao {Classes findById(int cid);
}
<select id="findById" resultType="Classes" parameterType="int">
select * from classes where cid=#{cid};
</select>
2.5、修改 SqlMapConfig.xml 文件
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
lazyLoadingEnabled: 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。默认为 true
aggressiveLazyLoading: 当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载, 说白了就是 aggressiveLazyLoading=true, 则 lazy load 等于没用, 所以要使用 lazy load 还是将其设为 false
2.6、修改测试类
@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 文件
import com.tyschool.mb005.javabean.Classes;
import java.util.List;
public interface IClassesDao {List<Classes> findAll1();
}
3.3、修改 Classes.java 文件
private List<StudentsNew> students;
public List<StudentsNew> getStudents() {return students;
}
public void setStudents(List<StudentsNew> students) {this.students = students;
}
3.4、修改 IClassesDao.xml 文件
<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 文件
<select id="findById" resultType="StudentsNew" parameterType="int">
select * from students where cid=#{cid};
</select>
3.6、修改测试类
@Test
public void findAll1(){List<Classes> list=classesDao.findAll1();
for(Classes c:list){System.out.println(c+":"+c.getStudents());
}
}
正文完
星哥玩云-微信公众号