mybatis-一对一的关联查询有两种配置方式
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-一对一的关联查询有两种配置方式相关推荐
- mybatis一对一联表查询的两种常见方式
1.一条语句执行查询(代码如下图) 注释:class表(c别名),teacher表(t别名)teacher_id为class表的字段t_id为teacher表的字段,因为两者有主键关联的原因,c_i ...
- Java框架篇---spring aop两种配置方式
Java框架篇---spring aop两种配置方式 第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中 ...
- SpringBoot的properties和yml两种配置方式, 配置注入参数, 以及配置文件读取失效的问题
SpringBoot支持两种配置方式,一种是properties文件,一种是yml 首先在pom文件中添加依赖: <dependency><groupId>org.spring ...
- Oracle数据库日期范围查询的两种实现方式
Oracle数据库日期范围查询有两种方式:to_char方式和to_date方式,接下来我们通过一个实例来介绍这一过程.我们假设要查询2011-05-02到2011-05-30之间的数据,实现方式如下 ...
- Oracle RAC集群资源的两种配置方式,Admin Managed 和 Policy Manager,以及实验
对于Oracle RAC集群数据库,有两种资源管理方式:Administrator Managed(管理员管理的),Policy Managed(策略管理的) 要理解这两个概念,首先应该了解Serve ...
- Vite内网ip访问,两种配置方式
问题 使用vite运行项目的时候,控制台会只出现127.0.0.1(localhost)本地地址访问项目.不可以通过公司内网ip访问,其他团队成员无法访问,这是因为没有将服务暴露在局域网中: 两种解决 ...
- Mybatis关联查询的两种方式
首先要了解对象的三种关联方式 *数据库表的关联关系有三种,一对一,一对多,多对多 一对一 是通过在任意一方的主键,引入对方主键作为外键来实现的,就是说主键与外键为同一字段 一对多 是通过在&q ...
- mybatis一对多的查询的两种方式
需求简介: 有3张表,部门 ---->组织 ---->员工,一个部门包含多个组织,每个组织下有多名员工,现在需要根据部门ID查询某个部门下的所有组织,以及每个组织下的所有员工信息,返回的是 ...
- springboot之jackson的两种配置方式
springboot 针对jackson是自动化配置的,如果需要修改,有两种方式: 方式一:通过application.yml 配置属性说明:## spring.jackson.date-format ...
最新文章
- java面向过程和面向对象
- 网页上的图片怎么提取出来_如何在网站上提取图片素材
- [渝粤教育] 中国地质大学 高层建筑施工 复习题
- 如何了解Google Analytics(分析)和网站访问量
- 基于点特征的各位姿求解算法对比(pose-estimation-compared)
- Arduino 实现八段数码管显示练习
- 探索 OpenStack 之(15):oslo.messaging 和 Cinder 中 MessageQueue 消息的发送和接收
- 连接mysql出现Access denied for user ‘root’@’localhost’ (using password:YES)问题解决办法...
- 苹果Mac时间日程管理工具:Things 备注支持 Markdown
- 侯世达:让机器学习思考的人
- android极光推送sequence,极光推送接入
- 腾讯云直播功能(云直播为例)
- Ruff 公开课回顾——物联网应用已经落地,区块链技术紧随其后
- leveldb安装以及使用
- NNDL 实验七 循环神经网络(3)LSTM的记忆能力实验
- QTabWidget 样式例子
- html语言h1h2h3,什么是H标签?H1,H2,H3标签使用的方法及重要性
- 批式CSV数据读取【Alink使用技巧】
- 计算机应用基础准考证打印,3月计算机等级考试准考证打印入口
- 2021年工具钳工(中级)考试试卷及工具钳工(中级)复审考试