全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📝 1 篇文章 15 道配套习题

高级结果映射专题

专题说明

本专题精选15道代表性题目,系统讲解MyBatis的高级结果映射功能,涵盖association一对一关联、collection一对多关联、嵌套结果映射与嵌套查询的区别、discriminator鉴别器动态映射、延迟加载配置(lazyLoadingEnabled/lazyLoadTrigger)、N+1查询问题与解决方案等核心内容,是MyBatis处理复杂关联关系的必备知识。

学习目标

  1. 掌握association元素实现一对一关联映射
  2. 掌握collection元素实现一对多关联映射
  3. 理解嵌套查询与嵌套结果映射的区别与适用场景
  4. 熟练使用discriminator鉴别器实现动态结果映射
  5. 掌握延迟加载的全局配置与局部配置
  6. 理解N+1查询问题的产生原因与解决方案

学习内容

本专题涵盖以下3个知识点:

知识点题目数核心内容
association 关联5题一对一关联、嵌套查询、嵌套结果映射
collection 集合5题一对多关联、ofType、延迟加载、N+1问题
discriminator 鉴别器5题动态映射、case匹配、resultMap引用

学习建议

  • 先阅读完整指南文章,理解高级结果映射的整体架构
  • 重点掌握association和collection的使用,注意区分一对一和一对多
  • 理解嵌套查询(select属性)与嵌套结果映射(JOIN SQL)的根本区别
  • discriminator是高级特性,根据列值动态选择resultMap
  • N+1问题是关联查询的经典问题,理解其产生原因与解决方案
  • 延迟加载只能缓解N+1问题,不能从根本上解决

📝 发现内容有误?点击此处直接编辑

📝 配套习题(15 题)

1
单选题

在 MyBatis 中,<discriminator> 元素用于根据查询结果中某列的值动态决定使用哪个 <resultMap>。以下关于 <discriminator> 的描述,哪一项是错误的?

A

<discriminator> 必须指定 columnjavaType 属性

B

<case> 元素的 value 属性用于匹配列的具体值

C

<discriminator> 内部可以嵌套多个 <case> 和一个默认的 <resultMap> 引用

D

<discriminator> 只能在 <select> 标签内部使用,不能与 <resultMap> 配合

2
单选题

在 MyBatis 中实现一对一关联映射时,以下哪种方式不适合用于关联查询?

A

使用 <association> 嵌套查询(select 属性)

B

使用 <association> 嵌套结果映射(resultMap 属性)

C

使用 <collection> 嵌套结果映射

D

在 SQL 中使用 JOIN 语句配合 <association> 的 resultMap 属性

3
多选题

在 MyBatis 中实现一对多集合映射时,以下哪些说法是正确的?

A

使用 <collection> 元素映射集合属性

B

ofType 属性用于指定集合中元素的类型

C

使用嵌套查询时,column 属性只能传递单个列值

D

使用嵌套结果映射时,需要通过列别名避免不同表同名列的冲突

E

集合属性在 Java 对象中必须初始化为空集合,否则会抛出 NPE

4
简答题

在 MyBatis 中实现多对多关联查询(如:用户-角色,通过用户角色关联表),请描述:

  1. 数据库表结构应该如何设计?
  2. 使用嵌套结果映射时,SQL 语句应如何编写?
  3. 如何在 resultMap 中配置多层级的集合嵌套?
5
判断题

在 MyBatis 中使用嵌套查询(select 属性)进行关联查询时,如果查询 10 个用户,每个用户关联 1 个部门,则总共会执行 11 次 SQL 查询。这种说法是否正确?

A

B

6
填空题

在 MyBatis 的全局配置中,启用延迟加载需要设置两个关键参数:

  1. 开启延迟加载的开关:!!1_!!
  2. 配置按需加载(即访问任意属性都触发延迟加载):!!2_!!
7
多选题

关于 MyBatis 中 <discriminator> 鉴别器的使用,以下哪些说法是正确的?

A

<discriminator>javaType 属性可以是 int、String 等 Java 类型

B

<case> 元素可以同时指定 resultMap 和内部的 <result> 映射

C

<discriminator> 必须放在 <select> 标签内部

D

<case> 没有匹配时,可以使用默认的映射规则继续映射

E

column 属性指定用于判断的列名,可以使用列别名

8
填空题

MyBatis 中一对一关联映射的两种主要方式:

  1. 嵌套查询:通过 !!1_!! 属性引用另一个 select 语句进行关联查询
  2. 嵌套结果映射:通过 !!2_!! 属性引用另一个 resultMap 进行 JOIN 结果映射
9
简答题

在 MyBatis 中实现一对多集合映射时,使用嵌套查询和嵌套结果映射各有什么优缺点?在什么场景下应该选择哪种方案?

10
单选题

以下哪种方式不能有效解决 MyBatis 中的 N+1 查询问题?

A

使用嵌套结果映射配合 SQL JOIN 查询

B

在 collection/association 中设置 fetchType="lazy" 启用延迟加载

C

在主查询中通过 LEFT JOIN 预先关联查询所有数据

D

使用 MyBatis Plus 的 @TableField(select = false) 注解

11
多选题

关于 MyBatis 延迟加载的配置和行为,以下哪些说法是正确的?

A

全局开启延迟加载后,所有关联查询默认都会延迟加载

B

通过 fetchType 属性可以单独控制某个关联的加载策略,覆盖全局设置

C

延迟加载的对象在序列化时会自动触发加载,不会出现问题

D

延迟加载的 SQL 会在访问关联属性时触发执行

E

使用 lazyLoadTrigger 设置为 false 时,只有访问延迟属性本身才会触发加载

12
判断题

在 MyBatis 中实现多对多关联查询时,必须通过中间表(关联表)将多对多关系拆分为两个一对多关系,这种说法是否正确?

A

B

13
简答题

MyBatis 中的 <discriminator> 鉴别器与 Java 中的 switch-case 语句有相似之处。请回答:

  1. <discriminator> 的主要作用是什么?
  2. 在实际项目中,什么业务场景适合使用鉴别器?
  3. <case> 没有匹配时,映射行为是怎样的?
14
多选题

在实际项目中,以下哪些策略可以有效缓解或解决 MyBatis 的 N+1 查询问题?

A

将嵌套查询改为嵌套结果映射,使用 SQL JOIN 一次性获取数据

B

开启延迟加载,只在真正需要关联数据时才执行查询

C

使用 @BatchSize 注解批量加载关联数据,将多次查询合并为少量批次

D

在主查询中使用子查询预先加载关联数据的 ID,减少后续查询数量

E

通过缓存(如 Redis)缓存关联查询结果,减少数据库访问次数

15
简答题

在电商系统中,用户(User)和用户详情(UserProfile)是一对一关系。请设计 MyBatis 的映射方案,并说明:

  1. 数据库表结构如何设计?
  2. 如何使用嵌套结果映射实现 JOIN 查询?
  3. 如果需要分别查询用户和用户详情,应如何设计 Mapper?
← 上一个专题 高级映射与复杂场景专题

📝 发现内容有误?点击此处直接编辑

想查看更多习题和详细解析?
小程序提供完整的题库和详细解析

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库