← 返回首页
一、MyBatis 核心原理
- 整体架构:接口层(SqlSession)→ 核心处理层(配置解析/SQL执行/结果映射)→ 基础支撑层(连接管理/事务/缓存)
- 核心组件:SqlSessionFactory → SqlSession → Executor → StatementHandler → ParameterHandler → ResultSetHandler
- 执行流程:加载配置 → 创建 SqlSessionFactory → 获取 SqlSession → 获取 Mapper 代理 → 执行 SQL → 结果映射
- Mapper 代理:基于 JDK 动态代理,接口方法与 XML 中的 SQL 语句通过 namespace + id 绑定
- #{ } vs ${ }:
#{} 预编译占位符(防 SQL 注入);$ 字符串拼接(用于动态表名/列名)
二、动态 SQL
- <if>:条件判断,
<if test="name != null">
- <choose> / <when> / <otherwise>:类似 switch-case,多条件分支
- <where>:自动去除多余的 AND/OR 前缀,替代手写
WHERE 1=1
- <set>:UPDATE 语句自动去除末尾多余逗号
- <foreach>:遍历集合,常用于 IN 查询和批量插入,属性:collection / item / open / close / separator
- <trim>:通用的前后缀处理,prefix / prefixOverrides / suffix / suffixOverrides
- <sql> + <include>:SQL 片段复用,提取公共字段列表
三、结果映射
- resultType:简单映射,列名与属性名一致时自动映射
- resultMap:复杂映射,支持列名与属性名不一致、嵌套对象
- association:一对一关联映射,嵌套查询(N+1 问题)或嵌套结果(JOIN 一次查询)
- collection:一对多关联映射,同样支持嵌套查询和嵌套结果
- discriminator:鉴别器,根据某列值映射到不同的 resultMap
- 自动映射:
mapUnderscoreToCamelCase=true 开启下划线转驼峰
四、缓存机制
一级缓存
- SqlSession 级别,默认开启,同一 SqlSession 内相同查询直接返回缓存
- 执行 update/insert/delete 或 commit/close 后清空
- Spring 集成下每次请求新建 SqlSession,一级缓存作用有限
二级缓存
- Mapper(namespace)级别,跨 SqlSession 共享,需手动开启
- 开启方式:全局
cacheEnabled=true + Mapper XML 中添加 <cache/>
- 实体类需实现 Serializable 接口
- 缺点:多表关联查询时缓存更新不及时,分布式环境需用 Redis 等外部缓存
五、插件机制(Interceptor)
- 拦截点:Executor / StatementHandler / ParameterHandler / ResultSetHandler 四大组件
- 实现方式:实现
Interceptor 接口,@Intercepts + @Signature 注解指定拦截目标
- 原理:基于 JDK 动态代理,形成拦截器链(责任链模式)
- 常见应用:分页插件(PageHelper)、SQL 性能监控、数据权限过滤、自动填充字段
六、MyBatis-Plus
- 核心理念:只做增强不做改变,引入即可使用,减少 XML 编写
- BaseMapper:继承即拥有 CRUD 方法,
selectById / insert / updateById / deleteById
- 条件构造器:
QueryWrapper / LambdaQueryWrapper(类型安全),链式构建查询条件
- 分页插件:
MybatisPlusInterceptor + PaginationInnerInterceptor,自动分页
- 代码生成器:
AutoGenerator 根据数据库表自动生成 Entity / Mapper / Service / Controller
- 自动填充:
@TableField(fill = FieldFill.INSERT),配合 MetaObjectHandler 自动填充创建时间等
- 逻辑删除:
@TableLogic 注解,DELETE 变为 UPDATE,查询自动过滤已删除数据
- 乐观锁:
@Version 注解 + OptimisticLockerInnerInterceptor,UPDATE 时自动检查版本号