什么是懒加载
按需加载,先从单表查询,需要时再从关联表去关联查询,能大大提高数据库性能,并不是所有场景下使用懒加载都能提高性能
Mybatis懒加载:resultMap里面的association、collection都有延迟加载功能
全局配置文件
<!--全局配置-->
<settings>
<!--延迟加载总开关-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--将aggressiveLazyLoading设置为false表示按需加载,默认为true-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
XXXXMapper.xml
<resultMap id="VideoOrderResultMapLazy" type="net.cybclass.online.domain.VideoOrder">
<id column="id" property="id"></id>
<result column="user_id" property="user_id"></result>
<result column="out_trade_no" property="out_trade_no"></result>
<result column="create_time" property="create_time"></result>
<result column="state" property="state"></result>
<result column="total_fee" property="total_fee"></result>
<result column="video_id" property="video_id"></result>
<result column="video_title" property="video_title"></result>
<result column="video_img" property="video_img"></result>
<!--
select:指定延迟加载需要执行的statement id
column:和select查询关联的字段
-->
<association property="user" javaType="net.cybclass.online.domain.User" column="user_id" select="findUserByUserId"/>
</resultMap>
<!--一对一关联查询订单,订单内容包含用户属性-->
<select id="queryVideoOrderListLazy" resultMap="VideoOrderResultMapLazy">
select
v.id,
v.out_trade_no,
v.create_time,
v.state,
v.total_fee,
v.video_id,
v.video_title,
v.user_id,
v.video_img,
u.name,
u.pwd,
u.phone,
u.head_img,
u.create_time create_time_u
from video_order v left join user u on v.user_id=u.id
</select>
<select id="findUserByUserId" resultType="net.cybclass.online.domain.User">
select * from user where id=#{id}
</select>
注:部分用户走了一级缓存SqlSession