什么是懒加载: 按需加载,先从单表查询,需要时再从关联表去关联查询,能大大提高数据库性
能,并不是所有场景下使用懒加载都能提高 效率
Mybatis懒加载: resultMap里面的association、collection有延迟加载功能
全局参数设置:
mybatis-config.xml
<!--延迟加载总开关-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--将aggressiveLazyLoading设置为false表示按需加载,默认为true-->
<setting name="aggressiveLazyLoading" value="false"/>
VideoOrderMapper.xml
<resultMap id="VideoOrderResultMapLazy" type="VideoOrder">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="out_trade_no" property="outTradeNo"/>
<result column="create_time" property="createTime"/>
<result column="total_fee" property="totalFee"/>
<result column="video_id" property="videoId"/>
<result column="video_title" property="videoTitle"/>
<result column="video_img" property="videoImg"/>
<!--Video 中 private User user;-->
<association property="user" javaType="User" select="findUserByUserId" column="user_id"/>
</resultMap>
<!--一对一管理查询订单,订单内部包含用户属性 懒加载-->
<select id="queryVideoOrderListLazy" resultMap="VideoOrderResultMapLazy">
select
o.id,
o.user_id,
o.out_trade_no,
o.create_time,
o.total_fee,
o.video_id,
o.video_title,
o.video_img
from video_order o
</select>
<select id="findUserByUserId" resultType="User">
select * from user where id = #{id,jdbcType=INTEGER}
</select>
VideoOrderMapper.java
public interface VideoOrderMapper {
/**
* 查询全部订单,关联用户 懒加载
* @return
*/
List<VideoOrder> queryVideoOrderListLazy();
}
测试代码:
public class SqlSessionDemo {
public static void main(String [] args) throws IOException {
//读取配置文件
String resouce="config/mybatis-config.xml";
InputStream inputStream= Resources.getResourceAsStream(resouce);
//构建Session工厂
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//获取Session
try(SqlSession sqlSession=sqlSessionFactory.openSession()){
VideoOrderMapper videoOrderMapper=sqlSession.getMapper(VideoOrderMapper.class);
List<VideoOrder> list1=videoOrderMapper.queryVideoOrderListLazy();
System.out.println(list1.size());
for (VideoOrder videoOrder:list1){
// System.out.println(videoOrder.getVideoTitle());
System.out.println(videoOrder.getUser());
}
}
}
}
效果截图:
请求到需要user信息的时候
请求不需要user信息的时候