实际开发过程中很多时候我们并不需要总是在加载用户信息时就一定要加载他的账户信息。此时就是我
们所说的延迟加载。

一、何为延迟加载

就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载.
好处:
先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速
度要快。
坏处:
因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗
时间,所以可能造成用户等待时间变长,造成用户体验下降。

二、实现需求

需求:
查询账户(Account)信息并且关联查询用户(User)信息。如果先查询账户(Account)信息即可满足要
求,当我们需要查询用户(User)信息时再查询用户(User)信息。把对用户(User)信息的按需去查询就是延迟加
载。
mybatis第三天实现多表操作时,我们使用了resultMap来实现一对一,一对多,多对多关系的操作。主要
是通过 association、collection 实现一对一及一对多映射。association、collection 具备延迟加载功
能。

三、使用 assocation 实现延迟加载

需求:
查询账户信息时,不查询用户信息。

1.账户的持久层 DAO 接口

/**
* 查询所有账户,同时获取账户的所属用户名称以及它的地址信息
* @return
*/
List<Account> findAll();

2.账户的持久层映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.oesoft.mybatis01.dao.IAccountDao"><!-- 建立对应关系 --><resultMap type="account" id="accountMap"><id column="id" property="id"/><result column="uid" property="uid"/><result column="money" property="money"/><!-- 它是用于指定从一方表引用实体属性 --><!--select: 填写我们要调用的 select 映射的 id,  column : 填写我们要传递给 select 映射的参数--><association property="user" javaType="user"select="cn.oesoft.mybatis01.dao.IUserDao.findById"column="uid"></association></resultMap><select id="findAll" resultMap="accountMap">select *from account</select>
</mapper>

3.用户的持久层接口和映射文件

 /*** 根据 id 查询* @param userId* @return*/User findById(int userId);
<!-- 根据 id 查询 --><select id="findById" resultType="cn.oesoft.mybatis01.domain.User" parameterType="_int">select *from userwhere id = #{uid}</select>

4.开启 Mybatis 的延迟加载策略

<!-- mybatis的主配置文件 -->
<configuration><!-- 开启延迟加载的支持 --><settings><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/></settings>

5.编写测试只查账户信息不查用户信息

@Testpublic void testFindAll() {List<Account> accounts = accountDao.findAll();}

我们发现,因为本次只是将 Account对象查询出来放入 List 集合中,并没有涉及到 User对象,所以就没有
发出 SQL 语句查询账户所关联的 User 对象的查询。

四、使用 Collection 实现延迟加载

同样我们也可以在一对多关系配置的<collection>结点中配置延迟加载策略。
<collection>结点中也有 select 属性,column 属性。
需求:
完成加载用户对象时,查询该用户所拥有的账户信息。

1. User 实体类中加入 List<Account>属性

2.编写用户和账户持久层接口的方法

/*** 查询所有用户,同时获取出每个用户下的所有账户信息* @return*/List<User> findAllByLazy();

/*** 根据用户 id 查询账户信息* @param uid* @return*/List<Account> findByUid(Integer uid);

3.编写用户持久层映射配置

<resultMap type="user" id="userMapByLazy"><id column="id" property="id"></id><result column="username" property="username"/><result column="address" property="address"/><result column="sex" property="sex"/><result column="birthday" property="birthday"/><!-- collection 是用于建立一对多中集合属性的对应关系ofType 用于指定集合元素的数据类型select 用于指定查询 account 列表的 sql 语句,所以填写的是该 sql 映射的 id(账户的 dao 全限定类名加上方法名称)column 用于指定 select 属性的 sql 语句的参数来源,下面的参数来自于 user 的 id 列,所以就写成 id 这一个字段名了--><collection property="accounts" ofType="account"select="cn.oesoft.mybatis01.dao.IAccountDao.findByUid"column="id"></collection></resultMap><!-- 配置查询所有操作 --><select id="findAllByLazy" resultMap="userMapByLazy">select *from user</select>

4.编写账户持久层映射配置

<!-- 根据用户 id 查询账户信息 --><select id="findByUid" resultType="account" parameterType="int">select *from accountwhere uid = #{uid}</select>

5.测试只加载用户信息

@Testpublic void testFindAllByLazy() {List<User> users = userDao.findAllByLazy();for (User user : users) {System.out.println(user.getSex());}}

11-Mybatis 延迟加载策略相关推荐

  1. java day56【 Mybatis 延迟加载策略 、 Mybatis 缓存、Mybatis 注解开发 】

    第1章 Mybatis 延迟加载策略 1.1 何为延迟加载? 1.2 实现需求 1.3 使用 assocation 实现延迟加载 1.3.1 账户的持久层 DAO 接口 1.3.2 账户的持久层映射文 ...

  2. mybatis延迟加载策略

    1.1 概述 我们已经知道mybatis中的一对一,一对多,多对多关系的配置及实现,可以实现对象的关联查询.实际开发过程中,我们并不需要加载用户信息时,就加载它的账户信息,而是在使用用户账号的时候,再 ...

  3. MyBatis-学习笔记11【11.Mybatis的缓存】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  4. 10【Mybatis延迟加载】

    文章目录 一.Mybatis 延迟加载 1.1 延迟加载介绍 1.1.1 搭建项目工程 1)SQL脚本: 2)引入依赖: 3)MyBatis核心配置文件: 4)实体类: 5)dao接口: 6)mapp ...

  5. mybatis延迟加载、缓存(一级、二级)

    一.mybatis的延迟加载 问题:在一对多中,当一个用户有100个账户. 1.在查询用户的时候,要不要把关联的账户查出来? 答:在查询用户时,用户下的账户信息应该是:什么时候使用,什么时候查询 2. ...

  6. Mybatis延迟加载机制

    Mybatis延迟加载机制--à 效率蛮高 @Test public void testFindById() { OrderType ot = new OrderType(); try { ot = ...

  7. Hibernate延迟加载策略

    所谓懒加载(lazy)就是延时加载,就是当在真正需要数据的时候,才真正执行数据加载操作 至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限 ,为了减少并发量, ...

  8. 小天带你轻松解决Mybatis延迟加载原理源码问题

    Mybatis延迟加载原理源码解析 Mybatis基本结构图 由上图可以知道MyBatis延迟加载主要使⽤:JavassistProxyFactory,CgliProxyFactoryb实现类.这两种 ...

  9. MyBatis延迟加载和缓存(4)

    一.项目创建 1.项目目录结构 2.数据库配置和上一篇的一样,这里不再描述.下面创建mybatis配置文件SqlMapConfig.xml 1 <?xml version="1.0&q ...

最新文章

  1. 使用PHPExcel将数据导出至Excel
  2. java 8 永久代_Java8内存结构—永久代(PermGen)和元空间(Metaspace)
  3. adfs服务器获取信息失败,在ADFS服务器上SAML LogOutRequest处理失败
  4. 七个小技巧保护无线网络安全
  5. [导入]屏蔽相应键盘按钮
  6. imx226_IMX226CQJ-海思网络摄像芯片
  7. 【愚公系列】2022年10月 微信小程序-电商项目-商品详情页面说明和商品导航
  8. 一些U盘启动盘电脑热键的对应关系
  9. IDEA learn 快捷键使用记录 --自用
  10. 低功耗MCU的选择方法
  11. python关键字参数必须位于位置参数之前_python函数中的参数(关键字参数,默认参数,位置参数,不定长参数)...
  12. Router中如何设置光标以全屏十字架显示
  13. 深度卷积网络:第二课
  14. Oracle11g新特性密码延迟验证的坑
  15. 正确使用 protobuf 的姿势
  16. 【随笔】2022的一些想法,关于多巴胺戒断
  17. 分析一个Auto.js写的抖音抢福袋脚本源码
  18. 一键分享功能ShareSDK
  19. 3.7V升压9V方案对比---万用表改装
  20. 我的安卓日程管理软件

热门文章

  1. 【Elasticsearch】Elasticsearch 集群健康值黄色 解决方案 或者 分片 未分配
  2. 95-080-046-源码-启动-flink-daemon.sh
  3. 95-140-110-源码-transform-算子keyBy
  4. 95-30-030-java.util-hashMap
  5. 【MySQL】MySQL删除数据库的时候卡死
  6. 【CDH】ClouderaManager集群报警,堆转储目录/tmp 或日志目录/var/log 可用空间小于 5.0 吉字节
  7. 几款炫酷的IDEA皮肤主题,大爱!
  8. 教你用纯Java实现一个即时通讯系统(附源码)
  9. php写的注册登录系统吗,php注册登录系统简化版_php技巧
  10. leetcode题解677-键值映射