延迟加载

一、什么是延迟加载

resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射), association、collection具有延迟加载功能。

延迟加载:先从单表查询,需要的时候再去关联表查询,大大提高数据库的性能,因为查询单表要比关联查询多张表速度更快。

二、使用 association 实现延迟加载

1、xxxMapper.xml

    <resultMap type="day01.Orders" id="FindOrderUserByLasyLoading">
        <!-- 对订单信息进行映射配置 -->
        <id column="id" property="id"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
        <result column="note" property="note"/>

        <!-- 实现对用户信息的延迟加载 
            select:指定延迟加载需要执行的statement的id(是根据user_id查询用户信息的statement)
            要使用 userMapper.xml中的getOne完成根据用户id(user_id)查询用户信息,因此加上 userMapper.xml的namespace
            column:订单信息中关联用户信息查询的列,即user_id -->
        <association property="user" javaType="day01.User" select="day02.UserMapper.getOne" column="user_id">
        </association>

    </resultMap>
    <select id="findOrderUserByLasyLoading" resultMap="FindOrderUserByLasyLoading">
        select * from orders
    </select>


2、延迟加载的配置(在SqlMapConfig中进行)

    <!-- 开启延迟加载 -->
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>


3、测试:

    @Test
    public void test3() {
        SqlSession sqlSession=sqlSessionFactory.openSession();
        UserCustomMapper userCustomMapper=sqlSession.getMapper(UserCustomMapper.class);
        //在这里不会去查询user,只会发送一条sql语句去查询orders
        List<Orders> list=userCustomMapper.findOrderUserByLasyLoading();    

        for(Orders orders:list) {
            //此时才会再发送一条sql语句去查询user信息,若当前user和上一次循环的user一样,仍然不会发送sql语句。
            User user = orders.getUser();
            System.out.println(user);
        }
        sqlSession.close();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值