【Mybatis专栏】(四)延迟加载LazyLoading

122 阅读1分钟

本文已参与新人创作礼活动,一起开启掘金创造之路。

延迟加载

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());

image.png

image.png

当业务逻辑需要取出student.classes时,开启延迟加载👇

Student student = studentRepository.lazyFindById(1);
System.out.println(student.getClasses());// 注意套娃

image.png