阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MyBatis-延迟加载

103次阅读
没有评论

共计 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()); } }

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-06-06发表,共计2968字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中