乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • 第1章 MyBatis概述与快速上手

    • 本章定位
    • MyBatis简介
    • 环境搭建
    • 第一个MyBatis程序
    • SqlSessionFactoryBuilder与openSession重载
    • SqlSessionFactory与SqlSession
    • SqlSession核心方法
    • 不使用 XML 构建 SqlSessionFactory
    • Mapper接口与映射方式
    • Java API 目录结构
  • 第2章 全局配置文件详解

    • 本章定位
    • properties
    • settings
    • typeAliases
    • typeHandlers
    • objectFactory
    • plugins
    • environments
    • transactionManager
    • dataSource
    • databaseIdProvider
    • mappers
    • 日志配置
  • 第3章 SQL映射文件基础

    • 本章定位
    • select
    • insert
    • update
    • delete
    • 参数传递与占位符
    • 主键生成策略
    • resultType
    • resultMap
    • 自动映射详解
    • sql片段
    • SQL 语句构建器
  • 第4章 动态SQL

    • 本章定位
    • if
    • choose、when、otherwise
    • where
    • set
    • foreach
    • trim
    • bind
    • script 元素:在注解映射器中启用动态 SQL
    • _databaseId 与动态 SQL 的多数据库支持
    • 动态 SQL 中插入脚本语言
  • 第5章 结果映射与关联查询

    • 本章定位
    • resultMap详解
    • association
    • collection
    • discriminator
    • N+1查询问题
    • 延迟加载
  • 第6章 MyBatis注解开发

    • 本章定位
    • @Select
    • @Insert
    • @Update
    • @Delete
    • @Param
    • @Options
    • @SelectKey
    • @Results
    • @Result
    • @One
    • @Many
    • @SelectProvider
  • 第7章 缓存与性能优化

    • 本章定位
    • 一级缓存
    • 二级缓存
    • 缓存配置详解
    • 自定义缓存
    • Executor执行器类型
    • 分页插件

"小崔,单表映射是幼儿园水平。生产环境全是关联查询,association和collection不通,你就写不出像样的DAO。"——白歌

本章定位

一句话:本章解决"如何将多表关联查询结果映射为嵌套对象结构、如何避免N+1性能陷阱"的问题。

飞翔科技的ERP系统需要展示"订单+用户+商品明细"的复杂页面,小崔一开始写了6条单表查询,页面加载耗时8秒。白歌一看日志:N+1问题。大翔下了死命令:本周内重构所有关联查询,必须一条SQL或延迟加载解决。这一章,小崔把MyBatis的结果映射高级武器全部解锁。


学习路线图

学习顺序说明:

  1. 先深钻resultMap(resultMap详解)→ 掌握所有子标签的语义和复用机制
  2. 再学一对一(association)→ 处理"订单属于一个用户"的对象嵌套
  3. 再学一对多(collection)→ 处理"一个部门有多个员工"的集合嵌套
  4. 再看鉴别器(discriminator)→ 处理"同一查询返回不同子类"的多态场景
  5. 最后攻性能(延迟加载 / N+1查询问题)→ 掌握关联查询的性能边界和规避方案

文件关系说明

文件一句话角色
resultMap详解.md本章地基:系统讲解resultMap的所有子标签(id/result/association/collection/discriminator)、继承复用(extends)和自动映射叠加
association.md一对一映射:将关联表的一行数据映射为当前对象的嵌套属性(如Order.user)
collection.md一对多映射:将关联表的多行数据映射为当前对象的集合属性(如Dept.employees)
discriminator.md多态鉴别:根据某列值决定使用哪个resultMap子分支,实现"同表不同类"的映射
延迟加载.md性能优化开关:关联对象按需加载,配合aggressiveLazyLoading和lazyLoadTriggerMethods精细控制
N+1查询问题.md性能避坑指南:分析N+1成因,对比嵌套结果映射(一条SQL)和延迟加载(多条SQL但按需)两种方案

知识图谱

核心概念关系:

  • resultMap 是"总容器",id/result 处理简单属性,association 处理嵌套对象,collection 处理嵌套集合,discriminator 处理多态分支
  • association 和 collection 都有两种加载方式:
    • 嵌套查询(select):发另一条SQL,可配延迟加载,但滥用导致N+1
    • 嵌套结果(resultMap):一条SQL JOIN多表,用resultMap分解列到不同对象,无N+1风险
  • discriminator 是"类型路由器",根据列值(如type=1走VIP映射,type=2走普通映射)切换分支
  • 延迟加载 是"性能缓冲垫":开启后,association/collection的嵌套查询不会立即执行,直到真正访问属性
  • N+1问题 是"性能红线":查询1条主数据触发N条关联查询,必须在架构层面规避

与下一章的衔接

本章学完后,小崔能用XML处理复杂关联映射,但每个Mapper都写XML文件,项目里XML越堆越多。白歌问:简单的CRUD能不能不写XML?

下一章《MyBatis注解开发》将解决:如何用 @Select、@Insert、@Update、@Delete 等注解直接在Mapper接口上写SQL,实现零XML的轻量级开发,以及注解与XML的取舍策略。

"XML适合复杂映射,注解适合简单CRUD。一个项目里两种风格并存,才是成熟的用法。"——白歌

下一页
resultMap详解