如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。 所以延迟加载即先从单表查询、需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
也就是说当不需要两个表进行关联的是时候,就不会进行关联,只在一张表上查询。需要关联时根据第一张表中的外码查询第二张表中的数据。
IDEA配置
mybatis默认没有开启延迟加载,需要在conf.xml中setting配置。
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 将积极加载改为消极加载,即延迟加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
再mapper.xml文件中,我们需要在association 或者collection中添加select标签和column标签,select标签指定使用哪个语句查询,column则根据第一张表中存储的外码,输入到这个语句中查询。
<select id="queryAllByNameLazyLoad" resultMap="student_card_map_lazy">
select * from person where name=#{name}
</select>
<select id="queryCardById" resultType="com.cztcode.mybatis.Card">
select * from person_card where card_id=#{card_id}
</select>
<resultMap id="student_card_map_lazy" type="Person">
<id property="id" column="id"/>
<result property="age" column="age"/>
<result property="name" column="name"/>
<association property="card" javaType="Card" select="queryCardById" column="card_id">
</association>
</resultMap>
实现效果:
不使用延迟加载时,查询第一张表的内容也会把第二张表关联上去,耗费时间。

使用延迟加载,查询第一张表的内容

当我们使用延迟加载后,如果查询第二张表的内容。会进行两次查找。
