本文已参与新人创作礼活动,一起开启掘金创造之路。
延迟加载
MyBatis 延迟加载机制,是实际开发中使⽤频率较⾼的⼀个功能,正确地使⽤延迟加载,可以有效
减少Java Application 和数据库的交互次数,从⽽提⾼整个系统的运⾏效率,延迟加载是为了提⾼程序运⾏效率的⼀种⼿段,⼀般应⽤于多表关联查询的业务场景。
【Mybatis专栏】(二)Mapper.xml实战 的栗子4中,当业务逻辑只需要取出student.name时,执行其findById,会访问student表和classes表,可实际情况下,只需要访问student表即可,所以会造成了低效,而延迟加载就是为了解决这种问题,动态地判断该执行哪些sql语句,从而减少与数据库不必要的交互
1、config.xml配置
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
2、延迟加载的mapper.xml配置👇
<resultMap id="lazyStudentMap" type="org.sample.entity.Student">
<!--column数据库表里面的字段,property实体类里面的属性-->
<id column="id" property="id"/>
<result column="name" property="name"/>
<association property="classes"
javaType="org.sample.entity.Classes"
select="org.sample.repository.ClassesRepository.findById"
column="cid"/>
</resultMap>
<select id="lazyFindById" parameterType="java.lang.Integer" resultMap="lazyStudentMap">
select * from t_student where id = #{id}
</select>
resultMap→association→select: 调用特定的mapper xml sql 语句,返回一个对象resultMap→association→column: 上述mapper xml sql 语句的形参
当业务逻辑只需要取出student.name时
Student student = studentRepository.lazyFindById(1);
System.out.println(student.getName());
当业务逻辑需要取出student.classes时,开启延迟加载👇
Student student = studentRepository.lazyFindById(1);
System.out.println(student.getClasses());// 注意套娃