1、嵌套结果:

(mybatis-standalone - MyBatisTest - testSelectBlogWithAuthorResult ())

<!-- 根据文章查询作者,一对一查询的结果,嵌套查询-->
<resultMap id="BlogWithAuthorResultMap"type="com.leon.domain.associate.BlogAndAuthor"><id column="bid" property="bid" jdbcType="INTEGER"/><result column="name" property="name" jdbcType="VARCHAR"/><!-- 联合查询,将author 的属性映射到ResultMap --><association property="author" javaType="com.leon.domain.Author"><id column="author_id" property="authorId"/><result column="author_name" property="authorName"/></association>
</resultMap>

2、嵌套查询:

(mybatis-standalone - MyBatisTest - testSelectBlogWithAuthorQuery ())

<!-- 另一种联合查询(一对一)的实现,但是这种方式有“N+1”的问题-->
<resultMap id="BlogWithAuthorQueryMap" type="com.leon.domain.associate.BlogAndAuthor"><id column="bid" property="bid" jdbcType="INTEGER"/><result column="name" property="name" jdbcType="VARCHAR"/><association property="author" javaType="com.leon.domain.Author"column="author_id" select="selectAuthor"/> <!-- selectAuthor 定义在下面-->
</resultMap>
<!-- 嵌套查询-->
<select id="selectAuthor" parameterType="int" resultType="com.leon.domain.Author">select author_id authorId, author_name authorNamefrom author where author_id = #{authorId}
</select>

其中第二种方式:嵌套查询,由于是分两次查询,当我们查询了员工信息之后,会再发送一条SQL 到数据库查询部门信息。

我们只执行了一次查询员工信息的SQL(所谓的1),如果返回了N 条记录,就会再发送N 条到数据库查询部门信息(所谓的N),这个就是我们所说的N+1 的问题。这样会白白地浪费我们的应用和数据库的性能。

如果我们用了嵌套查询的方式,怎么解决这个问题?能不能等到使用部门信息的时候再去查询?这个就是我们所说的延迟加载,或者叫懒加载。

在MyBatis 里面可以通过开启延迟加载的开关来解决这个问题。

在settings 标签里面可以配置:

<!--延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。默认false -->
<setting name="lazyLoadingEnabled" value="true"/>
<!--当开启时,任何方法的调用都会加载该对象的所有属性。默认false,可通过select 标签的
fetchType 来覆盖-->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- Mybatis 创建具有延迟加载能力的对象所用到的代理工具,默认JAVASSIST -->
<setting name="proxyFactory" value="CGLIB" />

lazyLoadingEnabled 决定了是否延迟加载。

aggressiveLazyLoading 决定了是不是对象的所有方法都会触发查询。

先来测试一下(也可以改成查询列表):

1、没有开启延迟加载的开关,会连续发送两次查询;

2 、开启了延迟加载的开关, 调用blog.getAuthor() 以及默认的(equals,clone,hashCode,toString)时才会发起第二次查询,其他方法并不会触发查询,比如blog.getName();

3、如果开启了aggressiveLazyLoading=true,其他方法也会触发查询,比如blog.getName()。

问题:为什么可以做到延迟加载?blog.getAuthor(),只是一个获取属性的方法,里面并没有连接数据库的代码,为什么会触发对数据库的查询呢?

我怀疑:blog 根本不是Blog 对象,而是被人动过了手脚!

把这个对象打印出来看看:

System.out.println(blog.getClass());

果然不对:

class com.leon.domain.associate.BlogAndAuthor_$$_jvst70_0

这个类的名字后面有jvst,是JAVASSIST 的缩写。原来到这里带延迟加载功能的对象blog 已经变成了一个代理对象,那到底什么时候变成代理对象的?我们后面在看源码的时候再去分析,这个也先留一个作业给大家。

mybatis-一对一的关联查询有两种配置方式相关推荐

  1. mybatis一对一联表查询的两种常见方式

    1.一条语句执行查询(代码如下图)  注释:class表(c别名),teacher表(t别名)teacher_id为class表的字段t_id为teacher表的字段,因为两者有主键关联的原因,c_i ...

  2. Java框架篇---spring aop两种配置方式

    Java框架篇---spring aop两种配置方式 第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步:  1. 使用注解@Aspect来定义一个切面,在切面中 ...

  3. SpringBoot的properties和yml两种配置方式, 配置注入参数, 以及配置文件读取失效的问题

    SpringBoot支持两种配置方式,一种是properties文件,一种是yml 首先在pom文件中添加依赖: <dependency><groupId>org.spring ...

  4. Oracle数据库日期范围查询的两种实现方式

    Oracle数据库日期范围查询有两种方式:to_char方式和to_date方式,接下来我们通过一个实例来介绍这一过程.我们假设要查询2011-05-02到2011-05-30之间的数据,实现方式如下 ...

  5. Oracle RAC集群资源的两种配置方式,Admin Managed 和 Policy Manager,以及实验

    对于Oracle RAC集群数据库,有两种资源管理方式:Administrator Managed(管理员管理的),Policy Managed(策略管理的) 要理解这两个概念,首先应该了解Serve ...

  6. Vite内网ip访问,两种配置方式

    问题 使用vite运行项目的时候,控制台会只出现127.0.0.1(localhost)本地地址访问项目.不可以通过公司内网ip访问,其他团队成员无法访问,这是因为没有将服务暴露在局域网中: 两种解决 ...

  7. Mybatis关联查询的两种方式

    首先要了解对象的三种关联方式 *数据库表的关联关系有三种,一对一,一对多,多对多 一对一   是通过在任意一方的主键,引入对方主键作为外键来实现的,就是说主键与外键为同一字段 一对多   是通过在&q ...

  8. mybatis一对多的查询的两种方式

    需求简介: 有3张表,部门 ---->组织 ---->员工,一个部门包含多个组织,每个组织下有多名员工,现在需要根据部门ID查询某个部门下的所有组织,以及每个组织下的所有员工信息,返回的是 ...

  9. springboot之jackson的两种配置方式

    springboot 针对jackson是自动化配置的,如果需要修改,有两种方式: 方式一:通过application.yml 配置属性说明:## spring.jackson.date-format ...

最新文章

  1. java面向过程和面向对象
  2. 网页上的图片怎么提取出来_如何在网站上提取图片素材
  3. [渝粤教育] 中国地质大学 高层建筑施工 复习题
  4. 如何了解Google Analytics(分析)和网站访问量
  5. 基于点特征的各位姿求解算法对比(pose-estimation-compared)
  6. Arduino 实现八段数码管显示练习
  7. 探索 OpenStack 之(15):oslo.messaging 和 Cinder 中 MessageQueue 消息的发送和接收
  8. 连接mysql出现Access denied for user ‘root’@’localhost’ (using password:YES)问题解决办法...
  9. 苹果Mac时间日程管理工具:Things 备注支持 Markdown
  10. 侯世达:让机器学习思考的人
  11. android极光推送sequence,极光推送接入
  12. 腾讯云直播功能(云直播为例)
  13. Ruff 公开课回顾——物联网应用已经落地,区块链技术紧随其后
  14. leveldb安装以及使用
  15. NNDL 实验七 循环神经网络(3)LSTM的记忆能力实验
  16. QTabWidget 样式例子
  17. html语言h1h2h3,什么是H标签?H1,H2,H3标签使用的方法及重要性
  18. 批式CSV数据读取【Alink使用技巧】
  19. 计算机应用基础准考证打印,3月计算机等级考试准考证打印入口
  20. 2021年工具钳工(中级)考试试卷及工具钳工(中级)复审考试

热门文章

  1. gentoo使用unicon支持中文
  2. Spark1.x和2.x如何读取和写入csv文件
  3. Oracle11gR2-聚簇因子浅析
  4. Linux系统巡检项目
  5. JS 处理十六进制颜色渐变算法-输入颜色,输出渐变rgb数组
  6. 判断线段相交(hdu1558 Segment set 线段相交+并查集)
  7. linux内核栈,内核同步,用户空间线程同步
  8. 【JDK源码】java.io包常用类详解
  9. Ajax系统学习总结
  10. Fedora 24的用户,千万不要在桌面里运行 `dnf update`