MyBatis的延迟加载的配置


延迟加载的配置的适用场景:


如果只查询单表就可以满足需求,为了提高数据库查询性能使用延迟加载,再查询关联信息。


延迟加载的配置


resultMap的配置

<resultMap type="com.hl.myabtis.first.beas.Orders" id="ordersUserLazyLoadResultMap">
        <!-- 对订单信息进行映射配置 -->
        <id column="id" property="id"/>
        <result column="user_id" property="user_id"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
        <result column="note" property="note"/>
        <!-- 实现用户信息延迟加载配置 
            select:指定延迟加载所需要执行的statement的ID
            column:关联查询的列
        -->
        <association property="user" javaType="com.hl.myabtis.first.beas.User" select="findUserById" column="user_id">

        </association>
    </resultMap>


查询用户

<select id="findUserById" parameterType="int" resultType="com.hl.myabtis.first.beas.User">
        select * FROM user WHERE id = #{id}
    </select>


引用resultMap

<!-- 查询订单信息,关联用户信息;用户信息需要延迟加载 -->
<select id="findOrdersUserLazyLoad" resultMap="ordersUserLazyLoadResultMap">
        SELECT * FROM orders
</select>


全局配置中

<settings>
    <!-- 开启全局性设置懒加载 -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 开启按需加载 -->
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>


测试用例:

@Test
    public void testFindOrdersUserLazyLoad() throws Exception{
        SqlSession sqlSession = sqlSessionFactory.openSession();//findOrdersAndOrderdetailAndItemsResultMap
        OrdersCustomMapper ordersMapper = sqlSession.getMapper(OrdersCustomMapper.class);
        List<Orders> list = ordersMapper.findOrdersUserLazyLoad();
        for (Orders order : list) {
            User user = new User();
            user = order.getUser();
            System.out.println(user.getUsername()+"=======");
        }
        sqlSession.close();
    }


解释一下:
当获取到了list时,并不会把user也加载出来,而是当你遍历使用到了user的属性时,才开始加载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值