MyBatis 延迟加载策略

文章源码

什么是延迟加载

延迟加载,就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据,也被成为懒加载。

好处:先从单表查询,需要时再从关联表去关联查询,大大提高了数据库性能。

坏处:因为当需要用到数据时才进行数据库查询,这样在进行大批量数据查询时,以可能造成用户等待时间变长,造成用户体验下降。

与延迟加载相对的,就是立即加载,它指的是不管用不用,只要一调用方法,马上发起查询。

在对应的四种表关系中,一对多和多对多通常情况下采用延迟加载,而多对一和一对一通常情况下采用立即加载。

延迟加载的使用

开启延迟加载的两个关键设置:

  • lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态 有效值为 true | false
  • aggressiveLazyLoading 开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载(参考lazyLoadTriggerMethods) 有效值为 true | false
  • lazyLoadTriggerMethods 指定对象的哪些方法触发一次延迟加载有效值为用逗号分隔的方法列表

使用 assocation 实现延迟加载

  • 账户的持久层 DAO 接口

    /**
    * 查询所有账户,懒加载
    * @return
    */
    List<Account> findAllLazy();
  • 账户的持久层映射文件

        <resultMap id="accountLazyMap" type="account">
    <id column="id" property="id"/>
    <result column="uid" property="uid"/>
    <result column="money" property="money"/>
    <association property="user" javaType="user" select="cn.parzulpan.dao.UserDAO.findByIdLazy" column="uid">
    </association>
    </resultMap>
    <!-- select: 填写要调用的 select 映射的 id-->
    <!-- column : 填写要传递给 select 映射的参数-->
    <select id="findAllLazy" resultMap="accountLazyMap">
    select * from account;
    </select>
  • 用户的持久层 DAO 接口

    /**
    * 查询所有信息,使用懒加载
    * @return
    */
    List<User> findByIdLazy();
  • 用户的持久层映射文件

        <select id="findByIdLazy" resultType="user" parameterType="int">
    select * from user where id = #{uid};
    </select>
  • 开启 Mybatis 的延迟加载策略

        <settings>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
    </settings>
  • 测试

        @Test
    public void findAllLazyTest() {
    List<Account> accounts = accountDAO.findAllLazy(); }

使用 collection 实现延迟加载

...

练习和总结

【MyBatis】MyBatis 延迟加载策略的更多相关文章

  1. Mybatis 延迟加载策略

    延迟加载: 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据.延迟加载也称懒加载. 好处: 先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速 ...

  2. Mybatis缓存及延迟加载策略

    一:引言 通过前面几篇的文章介绍了Mybatis的一对一.一对多.多对多关系的配置及实现,可是大家发现了吗?在执行关联查询的时候,直接会把当前查询的主表里包含的副表也查询后封装到对象里,其实在实际开发 ...

  3. mybatis的延迟加载、一级缓存、二级缓存

    mybatis的延迟加载.一级缓存.二级缓存 mybatis是什么? mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入 ...

  4. Mybatis之延迟加载机制

    1.  延迟加载的含义: 用到的时候才会去进行相关操作 2.  延迟加载的例子: 2.1 spring的BeanFactory,在getBean()的时候才创建Bean 2.2 物理分页查询,只有点击 ...

  5. Mybatis的延迟加载和缓存

    1. MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟加载规则推迟对关联对象的select查询.延迟加载可以有效的减少数据库压力.       注意:MyBatis的延迟加 ...

  6. MyBatis的延迟加载和缓存机制

    延迟加载: 什么是延迟加载: MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟规则推迟对关联对象的select查询.延迟加载可以有效的减少数据库压力. MyBatis根据对 ...

  7. Mybatis 测试延迟加载

    在学习mybatis的延迟加载时,对 lazyLoadingEnabled 和 aggressiveLazyLoading 的区别并不理解,特别是对查询的条件不同时,执行的查询语句也不一样,所以还是测 ...

  8. Mybatis Cache 缓存策略

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

  9. Mybatis的延迟加载和立即加载

    Mybatis的延迟加载和立即加载 示例:在一对多中,当我们有一个用户,他有100个帐户 问题1:在查询用户时,要不要把关联的账户查出来? 问题2:在查询账户时,要不要把关联的用户信息查出来? 问题1 ...

随机推荐

  1. CSP-S 2019 Solution

    Day1-T1 格雷码(code) 格雷码是一种特殊的 \(n\) 位二进制串排列法,要求相邻的两个二进制串恰好有一位不同,环状相邻. 生成方法: \(1\) 位格雷码由两个 \(1\) 位的二进制串 ...

  2. JavaSE05-数组

    1.概念 同一种类型数据的集合.其实数组就是一个容器. 2.优点 可以自动给数组中的元素从0开始编号,方便操作这些元素. 3.格式 1 元素类型[] 数组名 = new 元素类型[元素个数或数组长度] ...

  3. 登录linux时 shell执行顺序

    # .bash_history,.bash_logout,.bash_profile,.bashrc/etc/profile 全局.bash_history 记录当前登录用户历史操作的命令.bash_ ...

  4. 深度图解Redis Cluster原理

    不想谈好吉他的撸铁狗,不是好的程序员,欢迎微信关注「SH的全栈笔记」 前言 上文我们聊了基于Sentinel的Redis高可用架构,了解了Redis基于读写分离的主从架构,同时也知道当Redis的ma ...

  5. css 02-CSS属性:背景属性

    02-CSS属性:背景属性 #background 的常见背景属性 css2.1 中,常见的背景属性有以下几种:(经常用到,要记住) background-color:#ff99ff; 设置元素的背景 ...

  6. vue第九单元(非父子通信 events 单向数据流)

    第九单元(非父子通信 events 单向数据流) #课程目标 了解非父子组件通信的原理,熟练实现非父子组件间的通信(重点) 了解单向数据流的含义,并且明白单向数据流的好处 #知识点 #1.非父子组件间 ...

  7. [水题日常]UVA Partitioning by Palindromes

    一句话题意:每次给你一个字符串问最少划分成多少段才能使得每一段都是回文串. (下面用\(s[1..n]\)来表示这个字符串) 记\(dp[i]\)为\(s[1..i]\)的答案,如果对于某个\(j&l ...

  8. Geoserver 谷歌瓦片地图的使用 多级发布

    下面,我来介绍一下如何在离线的情况下,在Geoserver 中配置出如同谷歌地图般绚丽的效果. 为了让大家有动力看我我接下来写的东西,我先把结果图给大伙儿展现一下: 正如上图所示,该地图是谷歌第四级的 ...

  9. 《单元测试之道》Java版学习日志

    在软件工程这门课程中,首先谈单元测试的概念,单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的.很明确的功能是否正确.通常而言,一个单元测试是用于判断某个特定条件或某个特定函数的行为.我们 ...

  10. CentOS7 实战源码部署nginx网站服务器

    简介:实战演练nginx网站服务器的搭建 nginx 简介: Nginx是一款高性能的 HTTP 和反向代理服务器   Nginx的优点: 1.高并发量:根据官方给出的数据,能够支持高达 50,000 ...