# MyBatis Plus配置
**本文引用的文件**
- [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java)
- [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java)
- [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java)
- [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java)
- [OwnedEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/OwnedEntity.java)
- [InsertBatchOnDuplicateKeyUpdate.java](file://crm-base/src/main/java/com/crm/base/config/InsertBatchOnDuplicateKeyUpdate.java)
- [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java)
- [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java)
- [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java)
- [CrmBaseMapper.java](file://crm-base/src/main/java/com/crm/base/mapper/CrmBaseMapper.java)
- [application.yml](file://crm-app/src/main/resources/application.yml)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件围绕 MyBatis Plus 在该项目中的配置与使用进行系统化说明,重点覆盖:
- 分页插件、SQL 注入器、元对象填充处理器的配置与用法
- 自定义 SQL 注入器的实现原理(批量插入更新、逻辑删除等增强)
- 元对象填充处理器自动填充创建时间、更新时间等字段的机制
- 配置参数说明、性能优化建议与常见问题解决方案
## 项目结构
本项目将 MyBatis Plus 相关配置集中在基础模块 crm-base 的 config 包中,并通过应用模块 crm-app 的 application.yml 进行外部化配置。关键文件如下:
- MybatisPlusConfig:注册 MP 插件、全局策略、ID 生成器等
- CrmSqlInjector:自定义 SQL 注入器,扩展批量插入更新、逻辑删除等能力
- MetaObjectFillHandler:元对象填充处理器,统一自动填充审计字段
- BaseEntity / OwnedEntity:实体基类,定义通用审计与数据权限字段
- InsertBatchOnDuplicateKeyUpdate:批量插入时冲突处理策略
- CustomIdGenerator / SnowflakeIdWorker / SnowflakeProperties:分布式 ID 生成与配置
- CrmBaseMapper:基础 Mapper 接口,供业务 Mapper 继承
- application.yml:数据库连接、MP 全局配置等
```mermaid
graph TB
subgraph "应用层"
APP["应用启动
application.yml"]
end
subgraph "基础配置(crm-base)"
CFG["MybatisPlusConfig"]
INJ["CrmSqlInjector"]
FILL["MetaObjectFillHandler"]
BASE["BaseEntity / OwnedEntity"]
BATCH["InsertBatchOnDuplicateKeyUpdate"]
IDGEN["CustomIdGenerator / SnowflakeIdWorker / SnowflakeProperties"]
MAPPER["CrmBaseMapper"]
end
APP --> CFG
CFG --> INJ
CFG --> FILL
CFG --> IDGEN
CFG --> BATCH
MAPPER --> BASE
INJ --> BASE
FILL --> BASE
```
图表来源
- [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java)
- [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java)
- [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java)
- [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java)
- [OwnedEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/OwnedEntity.java)
- [InsertBatchOnDuplicateKeyUpdate.java](file://crm-base/src/main/java/com/crm/base/config/InsertBatchOnDuplicateKeyUpdate.java)
- [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java)
- [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java)
- [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java)
- [CrmBaseMapper.java](file://crm-base/src/main/java/com/crm/base/mapper/CrmBaseMapper.java)
- [application.yml](file://crm-app/src/main/resources/application.yml)
章节来源
- [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java)
- [application.yml](file://crm-app/src/main/resources/application.yml)
## 核心组件
- 分页插件:通过 MybatisPlusConfig 注册,提供 Page 分页查询能力,支持物理分页与排序。
- SQL 注入器:通过 CrmSqlInjector 扩展 MP 内置方法,如批量插入更新、逻辑删除等。
- 元对象填充处理器:通过 MetaObjectFillHandler 自动填充审计字段(如创建时间、更新时间)。
- 全局策略:配置表名、主键策略、逻辑删除、驼峰映射等。
- ID 生成器:基于雪花算法的分布式 ID 生成,支持可配置参数。
- 批量插入冲突处理:InsertBatchOnDuplicateKeyUpdate 定义 ON DUPLICATE KEY UPDATE 行为。
- 基础 Mapper:CrmBaseMapper 作为业务 Mapper 的统一父接口。
章节来源
- [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java)
- [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java)
- [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java)
- [InsertBatchOnDuplicateKeyUpdate.java](file://crm-base/src/main/java/com/crm/base/config/InsertBatchOnDuplicateKeyUpdate.java)
- [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java)
- [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java)
- [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java)
- [CrmBaseMapper.java](file://crm-base/src/main/java/com/crm/base/mapper/CrmBaseMapper.java)
## 架构总览
下图展示了 MyBatis Plus 在系统中的装配顺序与调用链路:应用启动加载配置,注册插件与处理器;业务调用 Mapper 时,由注入器增强方法;实体写入时由填充处理器自动填充审计字段;ID 生成器为新增记录分配唯一标识。
```mermaid
sequenceDiagram
participant App as "应用启动"
participant MP as "MybatisPlusConfig"
participant Inj as "CrmSqlInjector"
participant Fill as "MetaObjectFillHandler"
participant Gen as "CustomIdGenerator"
participant DB as "数据库"
App->>MP : 初始化并注册插件/策略/处理器
MP->>Inj : 注册自定义SQL注入器
MP->>Fill : 注册元对象填充处理器
MP->>Gen : 注册ID生成器
Note over MP,Gen : 完成全局装配
App->>DB : 业务调用(分页/插入/更新/删除)
DB-->>App : 返回结果
```
图表来源
- [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java)
- [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java)
- [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java)
- [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java)
## 详细组件分析
### 分页插件配置与使用
- 功能要点
- 启用物理分页,拦截 SQL 并追加 LIMIT/OFFSET 或方言特定语法
- 支持排序、条件过滤、总数统计
- 与 Page 对象配合,简化分页查询代码
- 配置位置
- 在 MybatisPlusConfig 中注册分页插件
- 可通过 application.yml 调整分页默认大小等参数
- 使用方式
- Service 层构造 Page 对象,传入查询条件与排序
- Mapper 执行分页查询后返回 PageResult 封装结果
章节来源
- [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java)
- [application.yml](file://crm-app/src/main/resources/application.yml)
### SQL 注入器(CrmSqlInjector)
- 设计目标
- 扩展 MP 内置方法,减少样板代码
- 提供批量插入更新、逻辑删除等常用能力
- 增强能力
- 批量插入更新:根据唯一键冲突策略合并更新
- 逻辑删除:对指定字段标记删除状态,查询自动过滤
- 其他自定义方法:可按需扩展
- 工作原理
- 继承 MP 注入器,重写方法注册逻辑
- 在 MP 初始化阶段将自定义方法注入到 Mapper 代理中
- 结合实体注解与全局策略生效
```mermaid
classDiagram
class CrmSqlInjector {
+注册批量插入更新()
+注册逻辑删除()
+扩展其他方法()
}
class MybatisPlusConfig {
+注册SQL注入器()
}
class BaseEntity {
+审计字段()
}
class OwnedEntity {
+数据权限字段()
}
MybatisPlusConfig --> CrmSqlInjector : "注册"
CrmSqlInjector --> BaseEntity : "读取注解/字段"
CrmSqlInjector --> OwnedEntity : "读取注解/字段"
```
图表来源
- [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java)
- [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java)
- [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java)
- [OwnedEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/OwnedEntity.java)
章节来源
- [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java)
- [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java)
### 元对象填充处理器(MetaObjectFillHandler)
- 功能要点
- 自动填充创建时间、更新时间、创建人、更新人等审计字段
- 支持按条件填充(仅在首次插入或每次更新时)
- 工作机制
- 实现 MP 的 MetaObjectHandler 接口
- 在 insertFill / updateFill 钩子中设置字段值
- 结合实体注解或命名约定识别待填充字段
- 适用场景
- 所有继承 BaseEntity / OwnedEntity 的实体自动获得审计能力
```mermaid
flowchart TD
Start(["插入/更新入口"]) --> CheckType{"操作类型"}
CheckType --> |插入| InsertFill["执行insertFill"]
CheckType --> |更新| UpdateFill["执行updateFill"]
InsertFill --> SetCreateTime["设置创建时间/创建人"]
UpdateFill --> SetUpdateTime["设置更新时间/更新人"]
SetCreateTime --> End(["完成"])
SetUpdateTime --> End
```
图表来源
- [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java)
- [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java)
- [OwnedEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/OwnedEntity.java)
章节来源
- [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java)
- [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java)
- [OwnedEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/OwnedEntity.java)
### 批量插入冲突处理(InsertBatchOnDuplicateKeyUpdate)
- 功能要点
- 定义批量插入时的冲突解决策略(如 ON DUPLICATE KEY UPDATE)
- 指定冲突时更新的字段集合
- 使用方式
- 在 MP 的批量插入方法中启用该策略
- 适用于幂等导入、增量同步等场景
章节来源
- [InsertBatchOnDuplicateKeyUpdate.java](file://crm-base/src/main/java/com/crm/base/config/InsertBatchOnDuplicateKeyUpdate.java)
### ID 生成器(CustomIdGenerator / SnowflakeIdWorker / SnowflakeProperties)
- 功能要点
- 基于雪花算法生成全局唯一 ID
- 支持通过配置文件调整机器位、序列位等参数
- 集成方式
- 在 MybatisPlusConfig 中注册自定义 ID 生成器
- 实体主键字段配置对应策略
章节来源
- [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java)
- [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java)
- [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java)
- [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java)
### 基础 Mapper(CrmBaseMapper)
- 功能要点
- 作为业务 Mapper 的统一父接口
- 可在此扩展通用方法(如分页、条件查询)
- 使用方式
- 业务 Mapper 继承 CrmBaseMapper,直接获得增强能力
章节来源
- [CrmBaseMapper.java](file://crm-base/src/main/java/com/crm/base/mapper/CrmBaseMapper.java)
## 依赖关系分析
- MybatisPlusConfig 依赖 CrmSqlInjector、MetaObjectFillHandler、ID 生成器与批量策略
- CrmSqlInjector 依赖实体基类以读取注解与字段信息
- MetaObjectFillHandler 依赖实体基类以识别审计字段
- 应用通过 application.yml 提供数据库与 MP 全局配置
```mermaid
graph LR
APP["application.yml"] --> CFG["MybatisPlusConfig"]
CFG --> INJ["CrmSqlInjector"]
CFG --> FILL["MetaObjectFillHandler"]
CFG --> IDGEN["CustomIdGenerator / SnowflakeIdWorker / SnowflakeProperties"]
CFG --> BATCH["InsertBatchOnDuplicateKeyUpdate"]
INJ --> BASE["BaseEntity / OwnedEntity"]
FILL --> BASE
```
图表来源
- [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java)
- [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java)
- [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java)
- [InsertBatchOnDuplicateKeyUpdate.java](file://crm-base/src/main/java/com/crm/base/config/InsertBatchOnDuplicateKeyUpdate.java)
- [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java)
- [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java)
- [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java)
- [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java)
- [OwnedEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/OwnedEntity.java)
- [application.yml](file://crm-app/src/main/resources/application.yml)
章节来源
- [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java)
- [application.yml](file://crm-app/src/main/resources/application.yml)
## 性能考虑
- 分页查询
- 合理设置 page size,避免一次性拉取过多数据
- 使用索引覆盖查询,减少回表
- 复杂条件尽量下推到数据库层
- 批量操作
- 使用批量插入/更新减少网络往返
- 控制单次批次大小,避免事务过大导致锁竞争
- 冲突策略选择合适字段,减少不必要的更新
- ID 生成
- 雪花算法分片均匀,注意时钟回拨防护
- 合理配置机器位与序列位,避免冲突
- 元对象填充
- 仅填充必要字段,避免多余赋值
- 区分插入与更新填充策略,降低无效写操作
[本节为通用指导,不直接分析具体文件]
## 故障排查指南
- 分页无效
- 检查是否已注册分页插件
- 确认 SQL 是否被拦截且未绕过 MP
- 逻辑删除失效
- 检查实体逻辑删除字段与全局策略配置
- 确认查询是否启用了逻辑删除过滤
- 元对象填充未生效
- 检查处理器是否注册
- 确认字段命名与注解是否符合预期
- 批量插入冲突策略异常
- 核对唯一键约束与冲突字段映射
- 检查数据库方言与语法支持
- ID 生成异常
- 检查雪花参数配置与节点隔离
- 关注时钟回拨与重复 ID 问题
章节来源
- [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java)
- [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java)
- [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java)
- [InsertBatchOnDuplicateKeyUpdate.java](file://crm-base/src/main/java/com/crm/base/config/InsertBatchOnDuplicateKeyUpdate.java)
- [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java)
- [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java)
- [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java)
## 结论
通过 MybatisPlusConfig 集中装配分页插件、SQL 注入器、元对象填充处理器与 ID 生成器,项目在数据访问层实现了高内聚、低耦合的增强能力。自定义 SQL 注入器提供了批量插入更新与逻辑删除等实用方法,元对象填充处理器统一了审计字段管理,配合合理的配置与性能优化策略,可有效提升开发效率与系统稳定性。
[本节为总结性内容,不直接分析具体文件]
## 附录
- 配置参数建议
- 分页默认大小:根据业务场景设定,避免过大
- 逻辑删除字段:统一命名,便于全局策略生效
- 雪花参数:确保节点唯一,避免时钟回拨
- 批量批次大小:平衡吞吐与内存占用
- 最佳实践
- 实体基类统一审计字段
- Mapper 继承基础接口,复用通用方法
- 服务层封装分页与批量操作,屏蔽底层细节
[本节为补充信息,不直接分析具体文件]