数据访问组件 (yudao-spring-boot-starter-mybatis)
引用文件
目录
简介
本文件面向 yudao-spring-boot-starter-mybatis 数据访问组件,系统性阐述其在 Spring Boot 生态中的 MyBatis Plus 集成、通用 Mapper 基类(BaseMapper)设计理念与增强能力、自动填充、多数据源与读写分离、动态数据源切换、分页查询、条件构造器、乐观锁与逻辑删除、数据库连接池、SQL 性能监控与 P6Spy 日志输出,以及 MyBatis 组件扩展点(自定义类型处理器、插件开发、批量操作优化)等主题。文档力求以循序渐进的方式呈现,既便于初学者理解,也为资深开发者提供深入的技术参考。
项目结构
该组件位于 yudao-framework 子模块中,作为 MyBatis Plus 的增强与封装,提供统一的自动配置、通用 Mapper 增强、动态表名、分页、自动填充、多数据源支持与 SQL 监控等能力。关键文件与职责如下:
- 自动配置与拦截器:YudaoMybatisAutoConfiguration 负责注册 MyBatis Plus 拦截器、 动态表名插件、自动填充处理器、主键生成策略等。
- 通用 Mapper 增强:BaseMapperX 在 MyBatis Plus 的 BaseMapper 与 MPJ 基础之上,提供分页、联表分页、条件便捷方法、批量操作等增强。
- 动态数据源:YudaoDataSourceAutoConfiguration、DynamicDataSourceProperties、DynamicDataSourceContextHolder 提供多数据源与动态切换能力。
- 配置属性:MybatisProperties 提供动态表名后缀配置项。
- 自动填充:DefaultDBFieldHandler 实现字段自动填充。
- 示例与集成:GoViewMysqlDataServiceImpl 展示手动切换数据源的使用方式;DataSourceConfigServiceImpl 展示数据源配置的增删改查。
图表来源
- YudaoMybatisAutoConfiguration.java
- BaseMapperX.java
- MybatisProperties.java
- DefaultDBFieldHandler.java
- YudaoDataSourceAutoConfiguration.java
- DynamicDataSourceProperties.java
- DynamicDataSourceContextHolder.java
- GoViewMysqlDataServiceImpl.java
- DataSourceConfigServiceImpl.java
章节来源
核心组件
- 通用 Mapper 增强 BaseMapperX
- 提供分页查询(含排序字段)、联表分页、条件便捷方法(等值、IN、计数、首条记录等)、批量插入/更新、删除等能力。
- 对 SQL Server 的批量插入做了兼容处理,避免批量插入后获取主键失败的问题。
- 自动配置 YudaoMybatisAutoConfiguration
- 注册 MyBatis Plus 拦截器链,包含动态表名插件、分页插件。
- 注册自动填充处理器 DefaultDBFieldHandler。
- 根据数据库类型选择合适的主键生成策略。
- 动态表名与分页
- 通过 ThreadLocal 维护表名后缀,结合 DynamicTableNameInnerInterceptor 实现按业务规则动态拼接表名。
- MyPaginationInnerInterceptor 提供分页能力。
- 多数据源与动态切换
- YudaoDataSourceAutoConfiguration 提供多数据源自动装配。
- DynamicDataSourceContextHolder 提供 push/clear 等上下文切换方法。
- 自动填充
- DefaultDBFieldHandler 实现创建时间、更新时间、创建者、更新者等字段的自动填充。
- 配置属性
- MybatisProperties 提供 addSuffixTableNames,声明需要自动追加后缀的表名集合。
章节来源
- BaseMapperX.java
- YudaoMybatisAutoConfiguration.java
- MybatisProperties.java
- DefaultDBFieldHandler.java
- YudaoDataSourceAutoConfiguration.java
- DynamicDataSourceContextHolder.java
架构总览
下图展示 MyBatis Plus 增强与多数据源的整体交互关系:
图表来源
详细组件分析
通用 Mapper 增强 BaseMapperX
- 设计理念
- 在 MyBatis Plus 的 BaseMapper 与 MPJ 基础之上,提供更贴近业务的便捷方法,减少重复代码。
- 将分页、联表分页、条件构造、批量操作等常用能力内聚到接口中,提升可维护性与一致性。
- 关键能力
- 分页查询:支持传入排序字段集合,自动构建分页对象并返回 PageResult。
- 联表分页:基于 MPJ 的 Lambda/Join 包装器,提供 selectJoinPage 多种重载。
- 条件便捷方法:提供按字段相等、IN、计数、首条记录等常用查询方法。
- 批量 操作:insertBatch、updateBatch 等,针对 SQL Server 做了兼容处理。
- 删除:按字段删除。
- 复杂度与性能
- 分页与联表分页基于 MyBatis Plus 内部分页实现,复杂度主要受数据量与索引影响。
- 批量插入/更新采用 Db 工具类,SQL Server 场景回退为逐条插入,避免主键回写问题。
图表来源
章节来源
自动配置与拦截器链
- 自动配置
- 在 MyBatis Plus 自动配置之前执行,确保 Mapper 扫描无警告。
- 启用配置属性绑定,注册 MyBatis Plus 拦截器链、动态表名插件、自动填充处理器、主键生成策略等。
- 拦截器链
- 动态表名插件:根据 ThreadLocal 中的表名后缀与配置的表名集合,动态拼接表名。
- 分页插件:MyPaginationInnerInterceptor 提供分页能力。
- 自动填充处理器:DefaultDBFieldHandler 实现字段自动填充。
- 主键生成策略
- 根据数据库类型选择合适的 IKeyGenerator,覆盖 PostgreSQL、Oracle、H2、Kingbase、DM 等。
图表来源
章节来源
动态表名与分页
- 动态表名
- 通过 ThreadLocal 维护表名后缀,结合 DynamicTableNameInnerInterceptor,在 SQL 解析阶段动态替换表名。
- 配合 MybatisProperties 的 addSuffixTableNames,仅对声明的表名进行后缀追加。
- 分页
- MyPaginationInnerInterceptor 提供分页能力,与 BaseMapperX 的分页方法配合使用。
图表来源
章节来源
多数据源、读写分离与动态切换
- 多数据源自动配置
- YudaoDataSourceAutoConfiguration 提供多数据源装配,DynamicDataSourceProperties 提供数据源配置属性。
- 动态切换
- DynamicDataSourceContextHolder 提供 push/clear 方法,结合业务上下文实现动态数据源切换。
- 使用示例
- GoViewMysqlDataServiceImpl 展示在执行特定查询前切换数据源,结束后清理上下文。
图表来源
- GoViewMysqlDataServiceImpl.java
- DynamicDataSourceContextHolder.java
- YudaoDataSourceAutoConfiguration.java
- DynamicDataSourceProperties.java
章节来源
- GoViewMysqlDataServiceImpl.java
- YudaoDataSourceAutoConfiguration.java
- DynamicDataSourceProperties.java
- DynamicDataSourceContextHolder.java
自动填充、乐观锁与逻辑删除
- 自动填充
- DefaultDBFieldHandler 实现创建时间、更新时间、创建者、更新者等字段的自动填充。
- 乐观锁
- 通过 MyBatis Plus 的版本号字段实现,配合数据库的行级 版本控制,防止并发覆盖。
- 逻辑删除
- 通过 MyBatis Plus 的逻辑删除注解与全局配置,实现软删除,不影响统计与历史数据。
章节来源
条件构造器与联表查询
- 条件构造器
- 基于 QueryWrapper/LambdaQueryWrapper,提供等值、IN、范围、排序等条件组合。
- 联表查询
- 基于 MPJ 的 MPJLambdaWrapper/MPJBaseJoin,提供联表分页与结果映射。
章节来源