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

MyBatis 高级技能认证测试

20 题 80 分钟 难度:

考察知识点

  • 源码架构与核心原理:SqlSessionFactory 构建流程、Executor 执行器体系、MappedStatement 映射机制、一级/二级缓存架构
  • 性能调优实战:SQL 执行计划分析、连接池配置优化、懒加载与 N+1 问题解决
  • 插件开发高级应用:Interceptor 拦截器原理、分页插件实现、签名解析机制
  • 多租户与数据权限:TenantLineInnerInterceptor 多租户隔离、数据权限动态过滤
  • 生态工具与扩展:MyBatis-Generator 代码生成、MyBatis-Plus 增强特性
  • 高级映射与复杂场景:ResultMap 嵌套映射、TypeHandler 自定义类型处理、动态 SQL 复杂场景
  • 生产环境最佳实践:配置安全加固、监控与日志体系、故障排查与应急方案
1
单选题

在 MyBatis 源码中,SqlSessionFactoryBuilder.build() 方法最终创建的 SqlSessionFactory 默认实现类是哪一个?

A

org.apache.ibatis.session.defaults.DefaultSqlSessionFactory

B

org.apache.ibatis.session.defaults.SimpleSqlSessionFactory

C

org.apache.ibatis.session.Configuration

D

org.apache.ibatis.executor.Executor

2
判断题

调用 SqlSession.close() 方法时,会同时关闭底层的数据库连接和回滚未提交的事务。

A

B

3
多选题

关于 RoutingStatementHandler,以下说法正确的有哪些?(多选)

A

它是 StatementHandler 接口的默认路由实现

B

它根据 MappedStatement.getStatementType() 决定使用哪个具体 Handler

C

它本身实现了 SQL 执行逻辑

D

它在构造时就会创建被委托的具体 Handler 实例

4
简答题

请描述从 SqlSessionFactoryBuilder.build()SqlSession.selectOne() 执行的完整流程中,涉及的核心组件及其作用。

5
单选题

使用 MyBatis 的 <foreach> 标签实现批量插入时,以下哪种配置方式是正确的?

A

设置 open="VALUES" close=";" separator="," 生成多条独立 INSERT 语句

B

设置 open="(" close=")" separator=")," 配合单条 INSERT INTO table VALUES 语句

C

设置 open="" close="" separator="INSERT INTO" 动态生成多条 INSERT

D

设置 open="BEGIN" close="END;" separator="" 使用 PL/SQL 块包装

6
单选题

某基于 MyBatis 的系统在高并发时段频繁出现 "Connection is not available, request timed out after 30000ms" 错误,但数据库端显示当前活跃连接数远低于连接池上限。最可能的原因是什么?

A

连接池的 maxLifetime 设置过长,连接在数据库端已关闭但连接池仍认为其有效

B

存在连接泄漏(Connection Leak),部分 SqlSession 使用后未正确关闭

C

minimumIdle 设置过小,连接池预热不足导致突发流量时无法及时获取连接

D

数据库端的 max_connections 参数限制导致连接池无法创建更多连接

7
多选题

分析 SQL 执行计划时,EXPLAIN 输出的 Extra 字段出现以下哪些值时,说明该查询存在明显的性能问题需要优化?

A

Using index

B

Using temporary

C

Using filesort

D

Using where

8
判断题

在 MyBatis 插件的 Plugin.wrap() 方法中,如果被代理对象已经是代理对象(即已经被前面的插件包装过),则不会再次创建新的代理,而是直接返回原有代理对象。()

A

B

9
简答题

请设计一个支持多数据库方言(MySQL、Oracle、PostgreSQL)的分页插件的核心逻辑。要求:

  1. 说明拦截哪个接口的方法
  2. 如何处理不同数据库的分页 SQL 语法差异
  3. 如何同时获取总记录数
  4. 如何保证分页参数的正确传递
10
简答题

请设计一个生产级别的 SQL 审计日志插件,要求回答以下问题:

  1. 应该拦截哪些 MyBatis 接口和方法?为什么?
  2. 如何在记录 SQL 参数的同时避免日志中打印敏感信息(如密码明文)?
  3. 审计日志的数据结构应包含哪些核心字段?
  4. 在高并发场景下,如何保证审计日志的写入性能?
11
多选题

关于 MyBatis 多租户架构的三种数据库设计方案(独立数据库、独立 Schema、共享 Schema),以下说法正确的有哪些?

A

独立数据库方案的数据隔离性最强,但运维成本最高

B

独立 Schema 方案可以在同一个数据库实例中通过不同 Schema 实现租户隔离

C

共享 Schema 方案最适合租户数量庞大且单租户数据量较小的 SaaS 场景

D

独立数据库方案无法实现租户之间的数据共享需求

E

三种方案可以混合使用,例如 VIP 租户使用独立数据库,普通租户共享 Schema

12
多选题

在 Spring 事务管理中结合动态数据源切换时,以下哪些说法是正确的?

A

在同一个 @Transactional 事务中可以切换到不同的数据源

B

数据源切换必须在事务开启之前完成

C

使用 @Transactional 时,Spring 会绑定事务开始时的数据源,后续切换无效

D

可以通过编程式事务(PlatformTransactionManager)在不同数据源间切换

E

分布式事务(如 Seata)可以解决跨数据源的事务一致性问题

13
填空题

在 MyBatis Generator 的配置文件中,<javaModelGenerator> 标签的 targetProject 属性用于指定实体类生成的项目路径,而 targetPackage 属性用于指定实体类生成的 1<sqlMapGenerator> 标签用于配置 XML 2 文件的生成;<javaClientGenerator> 标签的 type 属性通常设置为 3 表示生成 Mapper 接口。

14
单选题

关于 MyBatis-Plus 的 IService<T> 接口与 BaseMapper<T> 的关系,以下说法正确的是?

A

IService<T>BaseMapper<T> 的父接口,提供了更多 Service 层的通用方法

B

ServiceImpl<M extends BaseMapper<T>, T> 实现了 IService<T> 并内部委托给 BaseMapper<T> 执行数据库操作

C

IService<T> 只能通过 XML 映射文件来实现自定义查询

D

使用 IService 后就不能再使用 BaseMapper 的任何方法了

15
单选题

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

A

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

B

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

C

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

D

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

16
简答题

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

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

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

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

17
简答题

以下代码使用 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();
18
多选题

在生产环境中,针对 MyBatis 的监控体系,以下哪些指标是必须纳入告警范围的核心指标?

A

SQL 执行时间超过 500ms 的慢查询数量

B

数据库连接池活跃连接数占最大连接数的比例超过 80%

C

MyBatis 一级缓存命中率和二级缓存命中率

D

Mapper 方法的调用频率与平均响应时间趋势

19
填空题

在 MyBatis 生产环境中防止 SQL 注入,以下关键措施需要正确实现:

  1. 参数绑定必须使用 #{} 而不是 ______,因为前者使用 ______ 机制避免注入
  2. 对于必须使用 ${} 的场景(如动态 ORDER BY 字段),必须通过 ______ 校验限制输入范围
  3. 在 XML 中编写动态 SQL 时,<bind> 标签的 value 属性中如果拼接了用户输入,同样存在 ______ 风险
20
简答题

某金融系统要求在不重启服务的情况下,支持动态调整 MyBatis 的 Mapper XML SQL 语句(例如紧急修复一个性能有问题的 SQL)。请设计一套生产环境可用的 MyBatis SQL 热部署方案,要求:

  1. 描述 XML 变更的监听与触发机制
  2. 说明如何安全地重新加载 XML 并更新 MyBatis 的 Configuration
  3. 如何保证热加载过程中的线程安全(加载期间正在执行的 SQL 不受影响)
  4. 如果新 SQL 加载失败,如何实现自动回滚到旧版本
← 上一个试卷 MyBatis 概述与环境搭建专题测试
下一个试卷 → SQL 映射文件基础专题测试

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

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

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

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