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

高级映射与复杂场景专题

专题说明

本专题精选9道代表性题目,深入讲解MyBatis高级映射与复杂场景处理,涵盖嵌套结果集映射优化、大数据量查询优化、流式查询Cursor、复杂关系映射等高阶内容。

学习目标

  1. 理解嵌套结果集映射与N+1问题的本质区别
  2. 掌握流式查询(Cursor)在大数据量场景中的应用
  3. 学会处理复杂关系映射与多对多关系
  4. 掌握大数据量导出优化方案

学习内容

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

知识点题目数核心内容
嵌套结果集映射优化4题JOIN查询、内存结果集拆分、避免N+1问题
大数据量查询优化5题流式查询、Cursor、fetchSize、连接资源管理

学习建议

  • 重点理解嵌套结果集映射与嵌套select的根本区别
  • 流式查询必须在SqlSession打开状态下使用
  • MySQL驱动需要特殊配置才能启用真正的流式查询
  • 大数据量场景避免一次性加载全部结果到内存

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

📝 配套习题(9 题)

1
单选题

在 MyBatis 中处理一对多关联查询时,使用 collection 的嵌套结果集映射(嵌套查询)相比嵌套 select 语句方式,以下说法正确的是?

A

嵌套结果集映射会产生 N+1 次 SQL 查询

B

嵌套结果集映射通过单次 JOIN 查询即可完成,避免 N+1 问题

C

嵌套结果集映射无法处理多对多关系

D

嵌套结果集映射的性能始终低于嵌套 select 方式

2
多选题

在使用 MyBatis 的嵌套结果集映射处理多层关联查询(如 A → B → C)时,关于 columnPrefix 的使用和性能优化,以下说法正确的有?

A

多层 JOIN 查询时,每层关联的列必须使用 columnPrefix 进行区分

B

columnPrefix 允许同一个 resultMap 在不同层级中复用

C

嵌套结果集映射在处理百万级主表数据时内存消耗可控,不会 OOM

D

使用嵌套结果集映射时,应在数据库层面完成 JOIN,而非在 Java 层手动关联

3
单选题

在 MyBatis 中,使用 <discriminator> 实现继承关系映射时,以下关于 discriminator 工作机制的描述正确的是?

A

discriminator 在查询执行前就确定了返回值类型,无法实现多态查询

B

discriminator 根据指定列的值在运行时动态选择对应的 <case> 中定义的 resultMap

C

discriminator 只能用于单表查询,不支持 JOIN 场景

D

discriminatorcolumn 属性必须指向数据库的主键列

4
简答题

某电商系统中订单类型分为普通订单(NormalOrder)、团购订单(GroupOrder)和秒杀订单(SeckillOrder),三者共享基础订单字段(orderId、userId、amount、createTime),但各自有扩展字段:

  • 团购订单:groupSize、groupPrice
  • 秒杀订单:seckillId、seckillPrice

数据库使用单表 t_order 存储,通过 order_type 字段区分(0=普通,1=团购,2=秒杀)。

请设计 MyBatis 的 resultMap 结构,使用 discriminator 实现多态查询,要求写出核心 XML 配置。

5
判断题

在 MyBatis 中实现动态表名拼接时,可以使用 ${tableName} 语法直接将参数值拼接到 SQL 中,由于存在 SQL 注入风险,因此 MyBatis 框架层面禁止在 <select> 标签中使用 ${}

A

B

6
填空题

在 MyBatis 分表场景中,实现动态表名的两种常见方案:

方案一:在 XML 中使用 ________________________2_tableName!!}

方案二:实现 MyBatis 的 ___________ 接口,在 _________ 方法中通过反射修改 BoundSql 中的 SQL 语句,实现透明的表名替换,业务层无需感知分表逻辑。

7
多选题

在 MyBatis 中处理百万级数据导出时,使用流式查询(Cursor)相比传统 List 返回方式,以下说法正确的有?

A

流式查询通过设置 fetchSize 让数据库分批返回数据,降低 JVM 内存压力

B

流式查询的 Cursor 对象可以在 SqlSession 关闭后继续迭代读取数据

C

流式查询需要在 SqlSession 保持打开状态下迭代 Cursor,否则会抛出异常

D

使用 @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = Integer.MIN_VALUE) 可以在 MySQL 中启用真正的流式查询

8
简答题

以下代码使用 MyBatis 的 Cursor 进行大数据量流式查询,但存在多个问题。请指出至少 3 个问题并给出修正方案。

Java
public void exportLargeData() {
    SqlSession sqlSession = sqlSessionFactory.openSession();
    try {
        Cursor<User> cursor = userMapper.selectAllUsers();
        cursor.forEach(user -> {
            // 处理数据导出
            exportToCsv(user);
        });
    } finally {
        sqlSession.close();
    }
}

// Mapper 接口
@Select("SELECT * FROM t_user")
Cursor<User> selectAllUsers();
9
单选题

在 MyBatis 中实现全局逻辑删除(软删除)功能时,最合适的技术方案是?

A

在每个 Mapper 方法的 SQL 中手动添加 WHERE deleted = 0 条件

B

使用 MyBatis 拦截器(Interceptor)在 SQL 执行前自动追加 WHERE deleted = 0 条件

C

在数据库层面对 deleted 列创建索引即可自动过滤已删除数据

D

使用 MyBatis 的 <where> 标签配合全局变量实现自动过滤

← 上一个专题 缓存机制专题
下一个专题 → 高级结果映射专题

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

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

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

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