IT实战联盟博客:http://blog.100boot.cn

一.MyBatis延迟加载

1.延迟加载定义

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

  • 需求:如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查下用户信息。把对用户信息的按需去查询就是延迟加载。
  • 延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

2.使用association实现延迟加载

1)需求

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

2)mapper.xml

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

A、只查询订单信息:

SELECT * FROM orders

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

<!-- 查询订单关联查询用户 -->

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

SELECT * FROM orders </select>

B、关联查询用户信息

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

使用UserMapper.xml中的findUserById

<select id="findUserById" parameterType="int" resultType="user">

select * from user where id=#{value}

</select>

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

3)延迟加载resultMap

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

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

<resultMap type="joanna.yan.mybatis.entity.Orders" id="OrdersUserLazyLoadingResultMap">

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

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

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

<!-- 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="joanna.yan.mybatis.entity.User"

select="joanna.yan.mybatis.mapper.UserMapper.findUserById" column="user_id">

</association>

</resultMap>

4)mapper.java

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

public List<Orders> findOrdersUserLazyLoading() throws Exception;

5)测试

A、测试思路

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

B、延迟加载配置

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

在mybatis核心配置文件中配置:lazyLoadingEnabled、aggressiveLazyLoading

阿里Java架构师分享:MyBatis延迟加载与查询缓存,附演示实例

在SqlMapConfig.xml中配置:

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

<settings>

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

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

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

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

</settings>

C、测试代码

@Test public void findOrdersUserLazyLoadingTest() throws Exception{

SqlSession sqlSession=sqlSessionFactory.openSession();

OrdersCustomMapper ordersCustomMapper=sqlSession.getMapper(OrdersCustomMapper.class);

List<Orders> list=ordersCustomMapper.findOrdersUserLazyLoading(); for (Orders orders : list) { //执行getUser()去查询用户信息,这里实现按需加载

User user=orders.getUser();

System.out.println(user);

}

sqlSession.close();

}

6)延迟加载思考

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

定义两个mapper方法如下:

1)查询订单列表

2)根据用户id查询用户信息

实现思路:先去查询第一个mapper方法,获取订单信息列表

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

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

更多精彩内容可以关注“IT实战联盟”微信*公*众*号哦~~~

IT实战联盟博客:http://blog.100boot.cn

架构实战篇:使用MyBatis延迟加载模式为数据库减压,附演示实例相关推荐

  1. 实战篇 | 基于freeRTOS的多任务事件传输demo(附代码)

    之前分享了很多关于freeRTOS的知识,那么我们怎么在实战中去写代码呢?本篇文章重在对基于freeRTOS的架构代码的解析.整个功能如下图: 为什么要用freeRTOS 在实际项目中,如果程序等待一 ...

  2. 实战篇:如何用Keras建立神经网络(附全部代码)

    摘要: 机器学习实战篇:用简单的代码打造属于自己的神经网络模型- Keras是目前最受欢迎的深度学习库之一,对人工智能的商业化做出了巨大贡献.它使用起来非常简单,它使你能够通过几行代码就可以构建强大的 ...

  3. XenApp_XenDesktop_7.6实战篇之九:SQL Server数据库服务器规划及部署

    安装SQL Server 数据库,用于支持Desktop Studio 和桌面云管理台数据存储和访问.在简单的POC测试中,数据库可以只配置单机:但数据库故障时,不但影响配置管理台,也会影响DDC的运 ...

  4. 三层架构实战篇—系统登录实例

    上一篇博客,介绍了三层的一些基本理论,但是学习光有理论还是不行滴!马克思不也说过了吗?实践是检验真理的唯一标准! 所谓的三层分为物理上的三层和逻辑上的三层.物理上的三层包括:客户端(PC).应用服务器 ...

  5. 设备功耗计算专题《低功耗实战篇,ESP8266睡眠模式1@深度睡眠Deep-sleep》

    ESP8266 系列芯片提供三种可配置的睡眠模式,针对这些睡眠模式,我们提供了多种低功耗解决方案,用户可以结合具体需求选择睡眠模式并进行配置.三种睡眠模式如下: ESP8266低功耗解决方案之深度睡眠 ...

  6. spring cloud全家桶_阿里架构师玩转spring全家桶(实战篇),附赠3本spring电子书...

    Spring框架自诞生以来一直备受开发者青睐,今天在这里分享的是Spring全家桶实战篇电子书籍.书籍内容中包括了Spring.SpringBoot.SpringCloud.SpringMVC四个实战 ...

  7. 从零开始学架构5 - 实战篇

    从零开始学架构5 - 实战篇 38 | 架构师应该如何判断技术演进的方向? 潮流派? 保守派? 跟风派? 技术演进的动力 1)对于产品类业务,答案看起来很明显:技术创新推动业务发展! 苹果开发智能手机 ...

  8. 手撸Spring系列13:MyBatis(实战篇)

    说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...

  9. 实战篇-OpenSSL之AES加密算法-ECB模式

    本文属于<OpenSSL加密算法库使用系列教程>之一,欢迎查看其它文章. 实战篇-OpenSSL之AES加密算法-ECB模式 一.AES简介 二.ECB模式 1.命令行操作 2.函数说明 ...

  10. 实战篇-OpenSSL之TripleDES加密算法-ECB模式

    本文属于<OpenSSL加密算法库使用系列教程>之一,欢迎查看其它文章. 实战篇-OpenSSL之TripleDES加密算法-ECB模式 一.TripleDES简介 二.ECB模式 1.命 ...

最新文章

  1. spring框架四大原则
  2. CTFshow 信息收集 web20
  3. linux shell 脚本 2,理解Linux Shell和基本的Shell脚本(2)
  4. python库整理: Collections.Counter
  5. matlab 二维线图绘制函数 plot用法参数
  6. 网络编程应用:基于TCP协议【实现文件上传】--练习
  7. linux sftp自动输入密码,使用autoexpect避免sftp输入密码
  8. 网络协议 8 - TCP协议(上):性恶就要套路深
  9. iOS中有两种支持机制:Notification和KVO(Key-Value Observing)
  10. 高效率编辑器 VIM-操作篇,非常适合 VIM 新手
  11. pmwiki 安装和基本配置
  12. k-means 聚类算法
  13. ClassNotFoundException: javax.validation.ValidatorFactory
  14. 数电第三章 布尔代数与逻辑函数化简
  15. Advertising on Instagram 如何在Instagram上发布广告 Lynda课程中文字幕
  16. unnormal C++
  17. 使用七牛云存储解决ios7.1的app部署问题 https
  18. Excel收纳箱:VBA一键删除当前工作表的条件格式
  19. 数字图像处理第九章形态学处理
  20. CSR8670/8675 发射(TX SOURCE)USB发射A2DP音乐,实现MIC声音到主机

热门文章

  1. /proc/meminfo之谜
  2. x264源码下载信息
  3. CABAC基于上下文的自适应二进制熵编码
  4. B - I Hate It(单点更新)(区间求最大值)
  5. 用概率的方法计算Pi值
  6. oracle type rowtype详解
  7. 非常简单的conda环境重命名方法
  8. 建立云服务器_中国云游戏元年 顺网科技跻身头号玩家队列
  9. python自动化学习_Python自动化学习笔记(二)
  10. mysql 3.23.49,将旧的3.23.49 MySQL数据库转移到5.0.51 MySQL数据库 – 用ANSI和UTF-8编码...