高级映射与复杂场景专题测试
考察知识点
- 嵌套结果集映射优化:
collection嵌套映射与 N+1 问题的本质区别、columnPrefix复用机制 - 复杂继承映射:
discriminator动态多态映射、单表继承 resultMap 设计 - 动态表名与列名:
${}与#{}的根本差异、分表场景下的动态表名方案与拦截器介入 - 大数据量查询优化:流式查询(Cursor)原理、
fetchSize设置、事务边界与资源管理 - 软删除与逻辑删除:全局逻辑删除拦截器实现方案
在 MyBatis 中处理一对多关联查询时,使用 collection 的嵌套结果集映射(嵌套查询)相比嵌套 select 语句方式,以下说法正确的是?
在使用 MyBatis 的嵌套结果集映射处理多层关联查询(如 A → B → C)时,关于 columnPrefix 的使用和性能优化,以下说法正确的有?
在 MyBatis 中,使用 <discriminator> 实现继承关系映射时,以下关于 discriminator 工作机制的描述正确的是?
某电商系统中订单类型分为普通订单(NormalOrder)、团购订单(GroupOrder)和秒杀订单(SeckillOrder),三者共享基础订单字段(orderId、userId、amount、createTime),但各自有扩展字段:
- 团购订单:groupSize、groupPrice
- 秒杀订单:seckillId、seckillPrice
数据库使用单表 t_order 存储,通过 order_type 字段区分(0=普通,1=团购,2=秒杀)。
请设计 MyBatis 的 resultMap 结构,使用 discriminator 实现多态查询,要求写出核心 XML 配置。
在 MyBatis 中实现动态表名拼接时,可以使用 ${tableName} 语法直接将参数值拼接到 SQL 中,由于存在 SQL 注入风险,因此 MyBatis 框架层面禁止在 <select> 标签中使用 ${}。
在 MyBatis 分表场景中,实现动态表名的两种常见方案:
方案一:在 XML 中使用 ________________________2_tableName!!}。
方案二:实现 MyBatis 的 ___________ 接口,在 _________ 方法中通过反射修改 BoundSql 中的 SQL 语句,实现透明的表名替换,业务层无需感知分表逻辑。
在 MyBatis 中处理百万级数据导出时,使用流式查询(Cursor)相比传统 List 返回方式,以下说法正确的有?
以下代码使用 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 中实现全局逻辑删除(软删除)功能时,最合适的技术方案是?
📝 发现内容有误?点击此处直接编辑
长按或扫描二维码,立即体验