You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

17 KiB

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 全局配置等
graph TB
subgraph "应用层"
APP["应用启动<br/>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
  • CrmSqlInjector.java
  • MetaObjectFillHandler.java
  • BaseEntity.java
  • OwnedEntity.java
  • InsertBatchOnDuplicateKeyUpdate.java
  • CustomIdGenerator.java
  • SnowflakeIdWorker.java
  • SnowflakeProperties.java
  • CrmBaseMapper.java
  • application.yml

章节来源

  • MybatisPlusConfig.java
  • application.yml

核心组件

  • 分页插件:通过 MybatisPlusConfig 注册,提供 Page 分页查询能力,支持物理分页与排序。
  • SQL 注入器:通过 CrmSqlInjector 扩展 MP 内置方法,如批量插入更新、逻辑删除等。
  • 元对象填充处理器:通过 MetaObjectFillHandler 自动填充审计字段(如创建时间、更新时间)。
  • 全局策略:配置表名、主键策略、逻辑删除、驼峰映射等。
  • ID 生成器:基于雪花算法的分布式 ID 生成,支持可配置参数。
  • 批量插入冲突处理:InsertBatchOnDuplicateKeyUpdate 定义 ON DUPLICATE KEY UPDATE 行为。
  • 基础 Mapper:CrmBaseMapper 作为业务 Mapper 的统一父接口。

章节来源

  • MybatisPlusConfig.java
  • CrmSqlInjector.java
  • MetaObjectFillHandler.java
  • InsertBatchOnDuplicateKeyUpdate.java
  • CustomIdGenerator.java
  • SnowflakeIdWorker.java
  • SnowflakeProperties.java
  • CrmBaseMapper.java

架构总览

下图展示了 MyBatis Plus 在系统中的装配顺序与调用链路:应用启动加载配置,注册插件与处理器;业务调用 Mapper 时,由注入器增强方法;实体写入时由填充处理器自动填充审计字段;ID 生成器为新增记录分配唯一标识。

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
  • CrmSqlInjector.java
  • MetaObjectFillHandler.java
  • CustomIdGenerator.java

详细组件分析

分页插件配置与使用

  • 功能要点
    • 启用物理分页,拦截 SQL 并追加 LIMIT/OFFSET 或方言特定语法
    • 支持排序、条件过滤、总数统计
    • 与 Page 对象配合,简化分页查询代码
  • 配置位置
    • 在 MybatisPlusConfig 中注册分页插件
    • 可通过 application.yml 调整分页默认大小等参数
  • 使用方式
    • Service 层构造 Page 对象,传入查询条件与排序
    • Mapper 执行分页查询后返回 PageResult 封装结果

章节来源

  • MybatisPlusConfig.java
  • application.yml

SQL 注入器(CrmSqlInjector)

  • 设计目标
    • 扩展 MP 内置方法,减少样板代码
    • 提供批量插入更新、逻辑删除等常用能力
  • 增强能力
    • 批量插入更新:根据唯一键冲突策略合并更新
    • 逻辑删除:对指定字段标记删除状态,查询自动过滤
    • 其他自定义方法:可按需扩展
  • 工作原理
    • 继承 MP 注入器,重写方法注册逻辑
    • 在 MP 初始化阶段将自定义方法注入到 Mapper 代理中
    • 结合实体注解与全局策略生效
classDiagram
class CrmSqlInjector {
+注册批量插入更新()
+注册逻辑删除()
+扩展其他方法()
}
class MybatisPlusConfig {
+注册SQL注入器()
}
class BaseEntity {
+审计字段()
}
class OwnedEntity {
+数据权限字段()
}
MybatisPlusConfig --> CrmSqlInjector : "注册"
CrmSqlInjector --> BaseEntity : "读取注解/字段"
CrmSqlInjector --> OwnedEntity : "读取注解/字段"

图表来源

  • CrmSqlInjector.java
  • MybatisPlusConfig.java
  • BaseEntity.java
  • OwnedEntity.java

章节来源

  • CrmSqlInjector.java
  • MybatisPlusConfig.java

元对象填充处理器(MetaObjectFillHandler)

  • 功能要点
    • 自动填充创建时间、更新时间、创建人、更新人等审计字段
    • 支持按条件填充(仅在首次插入或每次更新时)
  • 工作机制
    • 实现 MP 的 MetaObjectHandler 接口
    • 在 insertFill / updateFill 钩子中设置字段值
    • 结合实体注解或命名约定识别待填充字段
  • 适用场景
    • 所有继承 BaseEntity / OwnedEntity 的实体自动获得审计能力
flowchart TD
Start(["插入/更新入口"]) --> CheckType{"操作类型"}
CheckType --> |插入| InsertFill["执行insertFill"]
CheckType --> |更新| UpdateFill["执行updateFill"]
InsertFill --> SetCreateTime["设置创建时间/创建人"]
UpdateFill --> SetUpdateTime["设置更新时间/更新人"]
SetCreateTime --> End(["完成"])
SetUpdateTime --> End

图表来源

  • MetaObjectFillHandler.java
  • BaseEntity.java
  • OwnedEntity.java

章节来源

  • MetaObjectFillHandler.java
  • BaseEntity.java
  • OwnedEntity.java

批量插入冲突处理(InsertBatchOnDuplicateKeyUpdate)

  • 功能要点
    • 定义批量插入时的冲突解决策略(如 ON DUPLICATE KEY UPDATE)
    • 指定冲突时更新的字段集合
  • 使用方式
    • 在 MP 的批量插入方法中启用该策略
    • 适用于幂等导入、增量同步等场景

章节来源

  • InsertBatchOnDuplicateKeyUpdate.java

ID 生成器(CustomIdGenerator / SnowflakeIdWorker / SnowflakeProperties)

  • 功能要点
    • 基于雪花算法生成全局唯一 ID
    • 支持通过配置文件调整机器位、序列位等参数
  • 集成方式
    • 在 MybatisPlusConfig 中注册自定义 ID 生成器
    • 实体主键字段配置对应策略

章节来源

  • CustomIdGenerator.java
  • SnowflakeIdWorker.java
  • SnowflakeProperties.java
  • MybatisPlusConfig.java

基础 Mapper(CrmBaseMapper)

  • 功能要点
    • 作为业务 Mapper 的统一父接口
    • 可在此扩展通用方法(如分页、条件查询)
  • 使用方式
    • 业务 Mapper 继承 CrmBaseMapper,直接获得增强能力

章节来源

  • CrmBaseMapper.java

依赖关系分析

  • MybatisPlusConfig 依赖 CrmSqlInjector、MetaObjectFillHandler、ID 生成器与批量策略
  • CrmSqlInjector 依赖实体基类以读取注解与字段信息
  • MetaObjectFillHandler 依赖实体基类以识别审计字段
  • 应用通过 application.yml 提供数据库与 MP 全局配置
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
  • CrmSqlInjector.java
  • MetaObjectFillHandler.java
  • InsertBatchOnDuplicateKeyUpdate.java
  • CustomIdGenerator.java
  • SnowflakeIdWorker.java
  • SnowflakeProperties.java
  • BaseEntity.java
  • OwnedEntity.java
  • application.yml

章节来源

  • MybatisPlusConfig.java
  • application.yml

性能考虑

  • 分页查询
    • 合理设置 page size,避免一次性拉取过多数据
    • 使用索引覆盖查询,减少回表
    • 复杂条件尽量下推到数据库层
  • 批量操作
    • 使用批量插入/更新减少网络往返
    • 控制单次批次大小,避免事务过大导致锁竞争
    • 冲突策略选择合适字段,减少不必要的更新
  • ID 生成
    • 雪花算法分片均匀,注意时钟回拨防护
    • 合理配置机器位与序列位,避免冲突
  • 元对象填充
    • 仅填充必要字段,避免多余赋值
    • 区分插入与更新填充策略,降低无效写操作

[本节为通用指导,不直接分析具体文件]

故障排查指南

  • 分页无效
    • 检查是否已注册分页插件
    • 确认 SQL 是否被拦截且未绕过 MP
  • 逻辑删除失效
    • 检查实体逻辑删除字段与全局策略配置
    • 确认查询是否启用了逻辑删除过滤
  • 元对象填充未生效
    • 检查处理器是否注册
    • 确认字段命名与注解是否符合预期
  • 批量插入冲突策略异常
    • 核对唯一键约束与冲突字段映射
    • 检查数据库方言与语法支持
  • ID 生成异常
    • 检查雪花参数配置与节点隔离
    • 关注时钟回拨与重复 ID 问题

章节来源

  • MybatisPlusConfig.java
  • CrmSqlInjector.java
  • MetaObjectFillHandler.java
  • InsertBatchOnDuplicateKeyUpdate.java
  • CustomIdGenerator.java
  • SnowflakeIdWorker.java
  • SnowflakeProperties.java

结论

通过 MybatisPlusConfig 集中装配分页插件、SQL 注入器、元对象填充处理器与 ID 生成器,项目在数据访问层实现了高内聚、低耦合的增强能力。自定义 SQL 注入器提供了批量插入更新与逻辑删除等实用方法,元对象填充处理器统一了审计字段管理,配合合理的配置与性能优化策略,可有效提升开发效率与系统稳定性。

[本节为总结性内容,不直接分析具体文件]

附录

  • 配置参数建议
    • 分页默认大小:根据业务场景设定,避免过大
    • 逻辑删除字段:统一命名,便于全局策略生效
    • 雪花参数:确保节点唯一,避免时钟回拨
    • 批量批次大小:平衡吞吐与内存占用
  • 最佳实践
    • 实体基类统一审计字段
    • Mapper 继承基础接口,复用通用方法
    • 服务层封装分页与批量操作,屏蔽底层细节

[本节为补充信息,不直接分析具体文件]