1、什么是延迟加载

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

    需求:

    如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。

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

2、使用association实现延迟加载

    2.1 需求

    查询订单并且关联查询用户信息

    2.2 mapper.xml

    需要定义两个mapper的方法对应的statement。

    • 只查询订单信息
    SELECT * FROM orders

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

    • 关联查询用户信息

    通过上边查询到的订单信息中user_id去关联查询用户信息

    使用UserMapper.xml中的findUserById

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

    2.3 延迟加载resultMap

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

    <!-- 延迟加载的resultMap -->
    <resultMap type="com.joe.mybatis.entities.Orders" id="OrdersUserLazyLoadingResultMap" > <!-- 配置映射的订单信息 -->
    <!-- id:指定查询列中的唯一标示,在这里是指订单中的唯一标示,如果有多列组成唯一标示,就需要配置多个id -->
    <!-- column:订单信息表的唯一标识列 property:订单信息的唯一标识列所映射到Orders类中的属性名 -->
    <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" /> <!-- 配置映射关联的用户信息 -->
    <!-- association:用户映射关联查询单个对象的信息 property:要将关联查询对象映射到Orders类中的属性名 javaType:property属性所指定的列的类型 -->
    <!--
    select:指定延迟加载需要执行的statement的id(是根据user_id查询用户信息的statement);
    使用UserMapper.xml文件中的findUserById(传入user_id)进行查询,如果findUserById不在本Mapper中,需要加上namespace
    column:订单信息中关联用户信息的列,是user_id
    关联查询的sql理解为:
    SELECT
    orders.*, (
    SELECT
    username
    FROM
    `user`
    WHERE
    `user`.id = orders.user_id
    ) username,
    (
    SELECT
    sex
    FROM
    `user`
    WHERE
    `user`.id = orders.user_id
    ) sex
    FROM
    orders
    -->
    <association property="user" javaType="com.joe.mybatis.entities.User"
    select="com.joe.mybatis.mapper.UserMapper.findUserById" column="user_id"> </association> </resultMap>

    2.4 mapper.java

    2.5 测试

    2.5.1 测试思路:

    • 执行上边mapper方法(findOrdersUserLazyLoading),内部去调用cn.itcast.mybatis.mapper.OrdersMapperCustom中的findOrdersUserLazyLoading只查询orders信息(单表)。
    • 在程序中去遍历上一步骤查询出的List<Orders>,当我们调用Orders中的getUser方法时,开始进行延迟加载。
    • 延迟加载,去调用UserMapper.xml中findUserbyId这个方法获取用户信息。

    2.5.2 延迟加载配置

    mybatis默认没有开启延迟加载,需要在SqlMapConfig.xml中setting配置。

    在mybatis核心配置文件中配置:

    lazyLoadingEnabled、aggressiveLazyLoading

    设置项 描述 允许值 默认值
    lazyLoadingEnabled

    全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。

    true | false

    false

    aggressiveLazyLoading

    当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。

    true | false

    true

    在SqlMapConfig.xml中配置:

    2.5.3 测试代码

    2.5.4 测试结果

3、延迟加载思考

    不使用mybatis提供的association及collection中的延迟加载功能,如何实现延迟加载??

    实现方法如下:

    定义两个mapper方法:

    • 查询订单列表

    • 根据用户id查询用户信息

    实现思路:

    先去查询第一个mapper方法,获取订单信息列表

    在程序中(service),按需去调用第二个mapper方法去查询用户信息。

    总之:

    使用延迟加载方法,先去查询简单的sql(最好单表,也可以关联查询),再去按需要加载关联查询的其它信息。

Mybatis学习记录(七)----Mybatis延迟加载的更多相关文章

  1. MyBatis学习总结(七)——Mybatis缓存(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...

  2. 【转】MyBatis学习总结(七)——Mybatis缓存

    [转]MyBatis学习总结(七)——Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualC ...

  3. MyBatis 学习记录5 MyBatis的二级缓存

    主题 之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类. 现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情 首先二级缓存默认是不开启的,需要自 ...

  4. MyBatis 学习记录4 MyBatis的一级缓存

    主题 分享记录一下MyBatis的一级缓存相关的学习. Demo public static void firstLevelCache() { init("mybatis-config.xm ...

  5. mybatis学习记录七——延迟加载

    14       延迟加载 14.1     什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.co ...

  6. MyBatis学习总结(七)——Mybatis缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  7. MyBatis学习总结(七)——Mybatis缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  8. MyBatis学习笔记(七)——Mybatis缓存

    转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4270403.html 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓 ...

  9. 七:MyBatis学习总结(七)——Mybatis缓存

    ---恢复内容开始--- 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地 ...

  10. mybatis学习记录二——mybatis开发dao的方法

    4.1     SqlSession使用范围 4.1.1     SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSession ...

随机推荐

  1. Vbox如何修改虚拟机器的uuid

    先是 X:   然后cd X:\Program Files\VirtualBox   然后是 VBoxManage internalcommands sethduuid "X:\Progra ...

  2. 二十三、【开源】EFW框架Web前端开发之常用组件(FusionCharts图表、ReportAll报表等)

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan ...

  3. google chrome set

    "D:\Program Files\Google\Chrome\Application\chrome_bk.exe" --start-maximized --user-data-d ...

  4. `cocos2dx非完整` 日志模块 增量更新

    在上一篇文章中,说到了"流程"的由来,以及我对流程的使用. 这一片就是对流程的应用.前一篇文章中说到了三条流程 check_log_measure, check_env_measu ...

  5. Only top uni produces good ppt.

    重要的事说三遍: 学技术,我只相信那几所top高校 学技术,我只相信那几所top高校 学技术,我只相信那几所top高校 <Good Habits you must own> Wake up ...

  6. Linux磁盘操作命令

    查看本地磁盘使用情况:df或者df -l单位为k 容量便于查看,以1024单位换算为M或者G等:df -h或者df -lh 以1000为单位换算:df -H 显示文件系统类型:df -T 显示指定文件 ...

  7. Win10系统80端口被pid=4的System进程占用 -- 解决方法

    背景: 今天在家里电脑下载phpstudy 2016后,准备启动服务器,结果提示80端口被占用 过程: 百度后有这几种解决方法: 1.IIS占用 .SQL server 2008的报表服务占用 可惜这 ...

  8. NVelocity的基本用法

    NVelocity常用语法指令 默认情况下,NVelocity解析是不分大小写的,当然可以通过设置runtime.strict.math=true,采用严格解析模式. 严格区分大小写有时候还是挺有用途 ...

  9. [操作系统实验lab4]实验报告

    实验概况 在开始实验之前,先对实验整体有个大概的了解,这样能让我们更好地进行实验. 我们本次实验需要补充的内容包括一整套以sys开头的系统调用函数,其中包括了进程间通信需要的一些系统调用如sys_ip ...

  10. 使用VS GDB扩充套件在VS上远端侦错Linux上的C/C++程序

    在 Linux 上开发 C/C++ 程序,或许你会直接(本机或远端)登入 Linux,打开编辑器写完代码后,就用 gcc/g++ 来编译,遇到要除错(debug)的时候,则会选择使用 gdb 来进行除 ...