mybatis系列:五、延迟加载

mybatis 延迟加载

简单概述

延迟加载其实就是将数据加载时机推迟,比如推迟嵌套查询的执行时机。在Mybatis中经常用到关联查询,但是并不是任何时候都需要立即返回关联查询结果。比如查询订单信息,并不一定需要及时返回订单对应的产品信息,查询商品分类信息并不一定要及时返回该类别下有哪些产品,这种情况一下需要一种机制,当需要查看时,再执行查询,返回需要的结果集,这种需求在Mybatis中可以使用延迟加载机制来实现。延迟加载可以实现先查询主表,按需实时做关联查询,返回关联表结果集,一定程度上提高了效率。

全局配置

lazyLoadingEnabled:是否启用延迟加载,mybatis默认为false,不启用延迟加载。lazyLoadingEnabled属性控制全局是否使用延迟加载,特殊关联关系也可以通过嵌套查询中fetchType属性单独配置(fetchType属性值lazy或者eager)。

aggressiveLazyLoading:是否按需加载属性,默认值false,lazyLoadingEnabled属性启用时只要加载对象,就会加载该对象的所有属性;关闭该属性则会按需加载,即使用到某关联属性时,实时执行嵌套查询加载该属性。

<settings>
    <!-- 延迟加载的总开关,默认false -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 设置为false,实现按需求加载,默认true -->
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

延迟加载

associate:select 指定查询的sql为findUserById,条件为user_id,并将结果封装到user中。

<resultMap id="ordersLazyLoadingUserResultMap" type="orders">
    <id property="id" column="id"/>
    <result property="number" column="number"/>
    <result property="createtime" column="createtime"/>
    <result property="note" column="note"/>
    <result property="user_id" column="user_id"/>
    
    <association property="user" javaType="cn.ade.domain.User"
                 select="findUserById" column="user_id"/>
</resultMap>

<select id="findAllOrders" resultMap="ordersLazyLoadingUserResultMap">
    SELECT * FROM orders;
</select>

<select id="findUserById" parameterType="int" resultType="user">
    SELECT * FROM user WHERE id = #{id}
</select>
@Test
public void findAllOrders() throws Exception {
    SqlSession session = factory.openSession();
    OrderMapper mapper = session.getMapper(OrderMapper.class);

	// 此时只会执行  SELECT * FROM orders
    List<Orders> allOrders = mapper.findAllOrders();
    System.out.println(allOrders);

    Orders orders = allOrders.get(0);
    // 此时执行 SELECT * FROM user WHERE id = #{id}
    User user = orders.getUser();
    System.out.println(user);
}
发布了48 篇原创文章 · 获赞 1 · 访问量 1039

猜你喜欢

转载自blog.csdn.net/laonxs/article/details/105187003