首先是resultMap的定义
<!-- 延迟加载的resultMap -->
<resultMap type="sc.ustc.po.Orders" id="userOrderResult">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<association property="user" javaType="sc.ustc.po.User"
select="sc.ustc.mapper.Mapper.findUserById" column="user_id" fetchType="lazy">
</association>
</resultMap>
select标签
<select id="findUserOrderLazyLoadingResultMap" resultMap="userOrderResult">
SELECT * from orders
</select>
mapper代理接口中方法定义:
public interface OrderMapperCustomer {
public List<Orders> findUserOrderLazyLoadingResultMap()throws Exception;
}
测试代码:
@Test
public void testFindUserOrderLazyLoadingResultMap() throws Exception {
SqlSession sqlSession=sf.openSession();
OrderMapperCustomer omc=sqlSession.getMapper(OrderMapperCustomer.class);
List<Orders> list=omc.findUserOrderLazyLoadingResultMap();
for(Orders orders:list) {
User user=orders.getUser();//这里会触发对user的加载
System.out.println(user);
}
}
测试代码断点设置在了for循环上,但是执行之后并没有起到延迟加载作用,如下图:
可以看到,代码运行到断点处时还没有执行getUser()方法,但是却执行了查询user的sql语句,也就是说懒加载失效了。。。
看了一下核心文件配置,懒加载也确实配置了,但是就是没有效果。
后来上网查阅资料才找到原因:原来在开启debug后,不能点开list信息,甚至不能把鼠标移到上面。否则在debug下会默认执行关联查询。
后来重试了一下,确实如此。