全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页

高级映射与复杂场景专题测试

9 题 50 分钟 难度:

考察知识点

  • 嵌套结果集映射优化collection 嵌套映射与 N+1 问题的本质区别、columnPrefix 复用机制
  • 复杂继承映射discriminator 动态多态映射、单表继承 resultMap 设计
  • 动态表名与列名${}#{} 的根本差异、分表场景下的动态表名方案与拦截器介入
  • 大数据量查询优化:流式查询(Cursor)原理、fetchSize 设置、事务边界与资源管理
  • 软删除与逻辑删除:全局逻辑删除拦截器实现方案
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> 标签配合全局变量实现自动过滤

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

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

想参加完整模拟考试?
小程序提供计时考试、自动评分和详细解析

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

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