延迟加载只有用的时候或输出结果的时候查询,不用不查询
使用嵌套查询
<mapper namespace="chapter09.com.xttc.mapper.ProductMapper">
<select id="findProductById" parameterType="Integer" resultType="product">
select * from tb_product where id in(select product_id from tb_ordersitem where orders_id = #{id})
</select>
</mapper>
<select id="findOrdersWithProduct" parameterType="Integer" resultMap="resultMap">
select * from tb_orders where id = #{id}
</select>
<resultMap id="resultMap" type="orders">
<id property="id" column="id"/>
<result property="number" column="number"/>
<!--column属性指定的内容:用户根据id查询时,所需要的参数的值(tb_orders表的id)-->
<collection property="productList" ofType="product" column="id"
select="chapter09.com.xttc.mapper.ProductMapper.findProductById"/>
</resultMap>
测试:
//测试
@Test
public void findOrdersWithProduct(){
SqlSession sqlSession = MybatisUtils.getSession();
OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
List<Orders> ordersWithProduct = mapper.findOrdersWithProduct(1);
// for (Orders orders : ordersWithProduct) {
// System.out.println(orders);
// }
sqlSession.close();
}
在不开启延迟加载之前查询结果:会发现SQL语句都被执行了
开启延迟加载
需要在mybatis配置文件里配置如下:
<settings>
<!--打开延迟加载的开关-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--将积极加载改为消息加载-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
查询结果:可以看到SQL只执行了一次,嵌套查询没有执行,用的时候才执行