您的位置:首页 > 其它

Mybatis深入了解----延迟加载

2016-07-18 16:39 363 查看


什么是延迟加载?

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

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


使用association实现延迟加载

    需要定义两个Mapper的方法对应的statement
只查询订单信息 

    在查询订单的statement中使用association去延迟加载(执行)下边的statement(关联查询用户信息)

[html] view
plain copy

 





<!-- 查询订单关联查询用户,用户信息需要延迟加载 -->  

<select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">  

    SELECT * FROM orders  

</select>  

 上面先去执行findOrdersUserlazyLoading,当需要去查询用户的时候回去执行findUserById,通过resultMap的定义将延迟加载执行配置起来。

延迟加载resultMap 

    使用association中的select指定延迟加载去执行的statement的id。

[html] view
plain copy

 





<!-- 延迟加载的resultMap -->  

<resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserLazyLoadingResultMap">  

        <!--对订单信息进行映射配置  -->  

        <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"/>  

        <!-- 实现对用户信息进行延迟加载  

        select:指定延迟加载需要执行的statement的id(是根据user_id查询用户信息的statement)  

        要使用userMapper.xml中findUserById完成根据用户id(user_id)用户信息的查询,如果findUserById不在本mapper中需要前边加namespace  

        column:订单信息中关联用户信息查询的列,是user_id  

        关联查询的sql理解为:  

        SELECT orders.*,  

(SELECT username FROM USER WHERE orders.user_id = user.id)username,  

(SELECT sex FROM USER WHERE orders.user_id = user.id)sex  

 FROM orders  

         -->  

        <association property="user"  javaType="cn.itcast.mybatis.po.User"  

         select="cn.itcast.mybatis.mapper.UserMapper.findUserById" column="user_id">  

        <!-- 实现对用户信息进行延迟加载 -->  

  

        </association>  

  

</resultMap>  


测试

测试思路

执行上边mapper方法(findOrdersUserLazyLoading),内部去调用cn.itcast.mybatis.mapper.OrdersMapperCustom中的findOrdersUserLazyLoading只查询orders信息(单表)。

在程序中去遍历上一步骤查询出的List,当我们调用Orders中的getUser方法时,开始进行延迟加载。

延迟加载,去调用UserMapper.xml中findUserbyId这个方法获取用户信息。

延迟加载配置 

mybatis默认没有开启延迟加载,需要在SqlMapConfig.xml中setting配置。在mybatis核心配置文件中配置:
设置项描述允许值默认值
lazyLoadingEnabled全局性设置懒加载。如果设为‘false’,则所有相关 莲的都会被初始化加载。ture/falsefalse
aggressiveLazyLoading当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。true/falsetrue
在SqlMapConfig.xml中配置:

[html] view
plain copy

 





<!-- 全局配置参数,需要时再设置 -->  

<settings>  

    <!-- 打开延迟加载 的开关 -->  

    <setting name="lazyLoadingEnabled" value="true"/>  

    <!-- 将积极加载改为消极加载即按需要加载 -->  

    <setting name="aggressiveLazyLoading" value="false"/>  

</settings>  

测试代码

[java] view
plain copy

 





// 查询订单关联查询用户,用户信息使用延迟加载  

@Test  

public void testFindOrdersUserLazyLoading() throws Exception {  

    SqlSession sqlSession = sqlSessionFactory.openSession();// 创建代理对象  

    OrdersMapperCustom ordersMapperCustom = sqlSession  

            .getMapper(OrdersMapperCustom.class);  

    // 查询订单信息(单表)  

    List<Orders> list = ordersMapperCustom.findOrdersUserLazyLoading();  

  

    // 遍历上边的订单列表  

    for (Orders orders : list) {  

        // 执行getUser()去查询用户信息,这里实现按需加载  

        User user = orders.getUser();  

        System.out.println(user);  

    }  

  

}  

总之,使用延迟加载方法,先去查询简单的sql(最好单表,也可以关联查询),再去按需要加载关联查询的其它信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: