MyBatis 高级技能认证测试
考察知识点
- 源码架构与核心原理:SqlSessionFactory 构建流程、Executor 执行器体系、MappedStatement 映射机制、一级/二级缓存架构
- 性能调优实战:SQL 执行计划分析、连接池配置优化、懒加载与 N+1 问题解决
- 插件开发高级应用:Interceptor 拦截器原理、分页插件实现、签名解析机制
- 多租户与数据权限:TenantLineInnerInterceptor 多租户隔离、数据权限动态过滤
- 生态工具与扩展:MyBatis-Generator 代码生成、MyBatis-Plus 增强特性
- 高级映射与复杂场景:ResultMap 嵌套映射、TypeHandler 自定义类型处理、动态 SQL 复杂场景
- 生产环境最佳实践:配置安全加固、监控与日志体系、故障排查与应急方案
在 MyBatis 源码中,SqlSessionFactoryBuilder.build() 方法最终创建的 SqlSessionFactory 默认实现类是哪一个?
调用 SqlSession.close() 方法时,会同时关闭底层的数据库连接和回滚未提交的事务。
关于 RoutingStatementHandler,以下说法正确的有哪些?(多选)
请描述从 SqlSessionFactoryBuilder.build() 到 SqlSession.selectOne() 执行的完整流程中,涉及的核心组件及其作用。
使用 MyBatis 的 <foreach> 标签实现批量插入时,以下哪种配置方式是正确的?
某基于 MyBatis 的系统在高并发时段频繁出现 "Connection is not available, request timed out after 30000ms" 错误,但数据库端显示当前活跃连接数远低于连接池上限。最可能的原因是什么?
分析 SQL 执行计划时,EXPLAIN 输出的 Extra 字段出现以下哪些值时,说明该查询存在明显的性能问题需要优化?
在 MyBatis 插件的 Plugin.wrap() 方法中,如果被代理对象已经是代理对象(即已经被前面的插件包装过),则不会再次创建新的代理,而是直接返回原有代理对象。()
请设计一个支持多数据库方言(MySQL、Oracle、PostgreSQL)的分页插件的核心逻辑。要求:
- 说明拦截哪个接口的方法
- 如何处理不同数据库的分页 SQL 语法差异
- 如何同时获取总记录数
- 如何保证分页参数的正确传递
请设计一个生产级别的 SQL 审计日志插件,要求回答以下问题:
- 应该拦截哪些 MyBatis 接口和方法?为什么?
- 如何在记录 SQL 参数的同时避免日志中打印敏感信息(如密码明文)?
- 审计日志的数据结构应包含哪些核心字段?
- 在高并发场景下,如何保证审计日志的写入性能?
关于 MyBatis 多租户架构的三种数据库设计方案(独立数据库、独立 Schema、共享 Schema),以下说法正确的有哪些?
在 Spring 事务管理中结合动态数据源切换时,以下哪些说法是正确的?
在 MyBatis Generator 的配置文件中,<javaModelGenerator> 标签的 targetProject 属性用于指定实体类生成的项目路径,而 targetPackage 属性用于指定实体类生成的 1;<sqlMapGenerator> 标签用于配置 XML 2 文件的生成;<javaClientGenerator> 标签的 type 属性通常设置为 3 表示生成 Mapper 接口。
关于 MyBatis-Plus 的 IService<T> 接口与 BaseMapper<T> 的关系,以下说法正确的是?
在 MyBatis 中处理一对多关联查询时,使用 collection 的嵌套结果集映射(嵌套查询)相比嵌套 select 语句方式,以下说法正确的是?
某电商系统中订单类型分为普通订单(NormalOrder)、团购订单(GroupOrder)和秒杀订单(SeckillOrder),三者共享基础订单字段(orderId、userId、amount、createTime),但各自有扩展字段:
- 团购订单:groupSize、groupPrice
- 秒杀订单:seckillId、seckillPrice
数据库使用单表 t_order 存储,通过 order_type 字段区分(0=普通,1=团购,2=秒杀)。
请设计 MyBatis 的 resultMap 结构,使用 discriminator 实现多态查询,要求写出核心 XML 配置。
以下代码使用 MyBatis 的 Cursor 进行大数据量流式查询,但存在多个问题。请指出至少 3 个问题并给出修正方案。
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();
在生产环境中,针对 MyBatis 的监控体系,以下哪些指标是必须纳入告警范围的核心指标?
在 MyBatis 生产环境中防止 SQL 注入,以下关键措施需要正确实现:
- 参数绑定必须使用
#{}而不是 ______,因为前者使用 ______ 机制避免注入 - 对于必须使用
${}的场景(如动态 ORDER BY 字段),必须通过 ______ 校验限制输入范围 - 在 XML 中编写动态 SQL 时,
<bind>标签的 value 属性中如果拼接了用户输入,同样存在 ______ 风险
某金融系统要求在不重启服务的情况下,支持动态调整 MyBatis 的 Mapper XML SQL 语句(例如紧急修复一个性能有问题的 SQL)。请设计一套生产环境可用的 MyBatis SQL 热部署方案,要求:
- 描述 XML 变更的监听与触发机制
- 说明如何安全地重新加载 XML 并更新 MyBatis 的 Configuration
- 如何保证热加载过程中的线程安全(加载期间正在执行的 SQL 不受影响)
- 如果新 SQL 加载失败,如何实现自动回滚到旧版本
📝 发现内容有误?点击此处直接编辑
长按或扫描二维码,立即体验