在前面的博文中,小编主要简单的介绍了mybatis中的高级映射,小伙伴们可以把mybatis和hibernate的因素进行对比,更加有利于理解。今天这篇博文,小编主要来简单介绍一下mybatis中的延迟加载。首先,我们需要知道什么是延迟加载,延迟加载(lazy load)是(也称为懒加载)Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。

延迟加载,可以简单理解为,只有在使用的时候,才会发出sql语句进行查询。
延迟加载的有效期是在session打开的情况下,当session关闭后,会报异常。当调用load方法加载对象时,返回代理对象,等到真正用到对象的内容时才发出sql语句。今天这篇博文,小编会从三个方面对延迟加载进行介绍。

一、延迟加载是什么?

二、使用association实现延迟加载。

三、延迟加载在mybatis核心配置文件sqlMapConfig.xml中的配置。小编会围绕着三个内容进行介绍,首先:

一、延迟加载是什么?

resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。
需求:如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。
延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

二、使用association实现延迟加载

需要定义两个mapper的方法对应的statement。
1、只查询订单信息
SELECT * FROM orders
在查询订单的statement中使用association去延迟加载(执行)下边的satatement(关联查询用户信息)
2、关联查询用户信息
通过上边查询到的订单信息中user_id去关联查询用户信息
OrderMapper.xml的延迟加载的核心代码:
使用association中的select指定延迟加载去执行的statement的id。代码如下所示:

<!-- 查询订单关联查询用户,用户信息按需延迟加载 的 resultMap定义 -->
    <resultMap type="com.mybatis.entity.Orders" id="ordersUserLazyLoading">
                <!--对订单信息进行映射配置  -->
            <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)
                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="com.mybatis.entity.User" select="findUserById" column="user_id"/>
    </resultMap>
        <!-- 根据Id查询用户,用于测试延迟加载 -->
        <select id="findUserById" parameterType="int" resultType="com.mybatis.entity.User" >
                select * from t_user where id=#{id}
        </select>
    <!-- 查询订单关联用户,用户信息延迟加载 -->
    <select id="findOrdersUserLazyLoading" resultMap="ordersUserLazyLoading">
            select * from orders
    </select>

OrderMapper.java的代码

public interface OrdersCustomMapper {
    /**查询订单,关联查询用户,用户按需延迟加载*/
    public List<Orders>findOrdersUserLazyLoading();
    /**根据Id查询用户(这个方法本应该放在UserMapper类的,测试方便先放在这)*/
    public User findUserById(int id);
}

测试思路及代码:
1、执行上边mapper方法(findOrdersUserLazyLoading),内部去调用OrdersMapperCustom中的 findOrdersUserLazyLoading只查询orders信息(单表)。
2、在程序中去遍历上一步骤查询出的List<Orders>,当我们调用Orders中的getUser方法时,开始进行延迟加载。

// 查询用户关联查询用户,用户信息延迟加载
        @Test
        public void TestFindOrdersUserLazyLoading() {
            SqlSession sqlSession = sqlSessionFactory.openSession();
            // 创建代理对象
            OrdersCustomMapper oc = sqlSession.getMapper(OrdersCustomMapper.class);
            // 调用mapper的方法
            List<Orders> list = oc.findOrdersUserLazyLoading();
            for(Orders order: list){
                //执行getUser()去查询用户信息,这里实现延迟加载
                User user = order.getUser();
                System.out.println(user);
            }
            sqlSession.close();
        }

三、延迟加载,去调用findUserbyId这个方法获取用户信息。
mybatis默认没有开启延迟加载,需要在SqlMapConfig.xml中setting配置。
在mybatis核心配置文件中配置:
lazyLoadingEnabled、aggressiveLazyLoading

<!-- 全局参数的配置 -->
    <settings>
            <!--打开延迟加载的开关  -->
        <setting name="lazyLoadingEnabled" value="true"/>
            <!--将积极加载改为消极加载及按需加载  -->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

小编寄语:该博文,小编主要简单的介绍了mybatis中的延迟加载,分别从什么是延迟加载,使用association实现延迟加载,延迟加载在mybatis核心配置文件sqlMapConfig.xml中的配置三个方面进行介绍,延迟加载,可以简单理解为,只有在使用的时候,才会发出sql语句进行查询,使用延迟加载方法,先去查询简单的sql(最好单表,也可以关联查询),再去按需要加载关联查询的其她信息。

【mybatis深度历险系列】延迟加载的更多相关文章

  1. 【mybatis深度历险系列】mybatis中的高级映射一对一、一对多、多对多

    学习hibernate的时候,小编已经接触多各种映射,mybatis中映射有到底是如何运转的,今天这篇博文,小编主要来简单的介绍一下mybatis中的高级映射,包括一对一.一对多.多对多,希望多有需要 ...

  2. 【mybatis深度历险系列】mybatis中的动态sql

    最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...

  3. 【mybatis深度历险系列】mybatis中的输入映射和输出映射

    在前面的博文中,小编介绍了mybatis的框架原理以及入门程序,还有mybatis中开发到的两种方法,原始开发dao的方法和mapper代理方法,今天博文,我们来继续学习mybatis中的相关知识,随 ...

  4. 【mybatis深度历险系列】深入浅出mybatis中原始dao的开发和mapper代理开发

    使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法.mybatis在进行dao开发的时候,涉及到三姐妹,分别是SqlSessionFactoryBuilder ...

  5. 【mybatis深度历险系列】mybatis的框架原理+入门程序解析

    在前面的博文中,小编介绍了springmvc的相关知识点,在今天这篇博文中,小编将介绍一下mybatis的框架原理,以及mybatis的入门程序,实现用户的增删改查,她有什么优缺点以及mybatis和 ...

  6. 分布式Redis深度历险-Cluster

    本文为分布式Redis深度历险系列的第三篇,主要内容为Redis的Cluster,也就是Redis集群功能. Redis集群是Redis官方提供的分布式方案,整个集群通过将所有数据分成16384个槽来 ...

  7. 分布式Redis深度历险-复制

    Redis深度历险分为两个部分,单机Redis和分布式Redis. 本文为分布式Redis深度历险系列的第一篇,主要内容为Redis的复制功能. Redis的复制功能的作用和大多数分布式存储系统一样, ...

  8. mybatis入门基础(七)----延迟加载

    一.什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: ...

  9. 【深度学习系列3】 Mariana CNN并行框架与图像识别

    [深度学习系列3] Mariana CNN并行框架与图像识别 本文是腾讯深度学习系列文章的第三篇,聚焦于腾讯深度学习平台Mariana中深度卷积神经网络Deep CNNs的多GPU模型并行和数据并行框 ...

随机推荐

  1. 推荐系统——online(上)

    框架介绍 上一篇从总体上介绍了推荐系统,推荐系统online和offline是两个组成部分,其中offline负责数据的收集,存储,统计,模型的训练等工作:online部分负责处理用户的请求,模型数据 ...

  2. 闲聊 Exp/Imp 命令使用

    1.Exp/Imp 命令可用的参数: 2.userid 参数必须跟在 Exp/Imp 命令的后面,可以省略,如 Exp Userid=用户名/密码@数据库实例名 或者 Exp 用户名/密码@数据库实例 ...

  3. Linux(二)CentOS的安装

    centos6.8 链接:https://pan.baidu.com/s/1TjCYXzijMzfpiZ9Z-D1Qhg 密码:7mvn 2.1 新建虚拟机 1 2.2 选中稍后安装操作系统(先把虚拟 ...

  4. win10下 github+hexo搭建个人博客.md

    我的博客地址 https://chenxianfu.github.io/ 遇到的坑 hexo 问题 4000端口打不开,可能端口占用,请输入一下命令 hexo server -p 4001 针对很多人 ...

  5. dev gridControl 自定义绘制列头颜色

    1.添加事件CustomDrawColumnHeader private void gvw1_CustomDrawColumnHeader(object sender, DevExpress.Xtra ...

  6. Discuz! 7.x 反射型xss

    引用:http://wooyun.jozxing.cc/static/bugs/wooyun-2014-084097.html 在/include/global.func.php 文件中 第1036- ...

  7. [BZOJ 4589]Hard Nim

    Description 题库链接 两人玩 \(nim\) 游戏,\(n\) 堆石子,每堆石子初始数量是不超过 \(m\) 的质数,那么后手必胜的方案有多少种.对 \(10^9+7\) 取模. \(1\ ...

  8. [HNOI 2001]求正整数

    Description 对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m.例如:n=4,则m=6,因为6有4个不同整数因子1,2,3,6:而且是最小的有4个因子的整数. Input n ...

  9. [Codeforces]852I - Dating

    题目大意:给定一棵n个点的树,每个点上有一个汉子或妹子,每人有一个权值,每次询问一条链上选出一对权值相等的男女有多少种选法.(n,q<=10^5) 做法:比较显然的树上莫队,熟悉序列莫队那套理论 ...

  10. 习题9-8 Uva1632

    题意: 给你n个宝藏,然后给出他们的位置a[i]以及存在时间tim[i],如果能全部拿完,求出最短时间: 否则输出No solution 思路: 对于一段区间[i,j],你取完之后肯定是在最左端或者最 ...