Skip to content

DDK MyBatis Starter ​

给 MyBatis-Plus 补上三个几乎每个项目都要写的默认件:分页插件、雪花 ID 生成器、创建/更新时间自动填充;并注册通用仓储所依赖的 MapperProvider。

能做什么 ​

  • 注册 MybatisPlusInterceptor:只装了一个 PaginationInnerInterceptor,参数硬编码为 DbType.MYSQL、maxLimit=500、overflow=false。
  • 注册 IdentifierGenerator:实现为 IdUtil.getSnowflakeNextId()(Hutool 5.8.34 的雪花算法),作用于 @TableId(type = IdType.ASSIGN_ID) 的主键。
  • 注册 MetaObjectHandler:插入时严格填充 createTime、updateTime,更新时填充 updateTime,类型固定为 LocalDateTime。
  • 注册 MapperProvider:GenericRepositoryImpl 做 Entity ↔ PO 转换时依赖它。它必须由自动配置注册而不是靠 @Component——MapperProvider 在 ddk-core 这个库 jar 里,业务应用的启动类通常在自己的包下,component scan 扫不到 com.ddk,那样注入会直接失败。
    • 因此用通用仓储时要引这个 starter,而不是只引 ddk-mybatis。
  • 依赖聚合:传递引入 ddk-mybatis(GenericRepositoryImpl、QueryParser、MybatisPlusPageAdapter 等 DDD 仓储支撑代码),并通过它带上 mybatis-plus-spring-boot3-starter(3.5.16);本模块另外显式依赖 mybatis-plus-jsqlparser(分页插件解析 SQL 必需)。
    • MyBatis / MyBatis-Plus 本身的装配(SqlSessionFactory、MapperScannerConfigurer、mybatis-plus.* 配置)全部来自 mybatis-plus-spring-boot3-starter 的自动配置,本 starter 不参与。

pom 的 <description> 里写了 "data permission"(数据权限),代码里没有任何数据权限相关实现,不要按描述预期。

引入方式 ​

xml
<dependency>
    <groupId>com.ddk</groupId>
    <artifactId>ddk-mybatis-starter</artifactId>
    <version>${ddk.version}</version>
</dependency>

还需要自行提供数据源依赖(如 mysql-connector-j)和数据源配置。import 了 ddk-dependencies BOM 之后 <version> 可以省略(BOM 已经填充,见快速开始)。

配置项 ​

本 starter 没有任何 @ConfigurationProperties,分页上限、数据库方言、填充字段名都是硬编码,无法通过配置修改。

可用的配置前缀全部来自 MyBatis-Plus 自己:

配置项类型默认值说明
mybatis-plus.mapper-locationsString[]classpath*:/mapper/**/*.xmlMyBatis-Plus starter 提供
mybatis-plus.type-aliases-packageString无MyBatis-Plus starter 提供
mybatis-plus.global-config.db-config.*-MP 默认逻辑删除字段、主键策略等,MyBatis-Plus starter 提供
mybatis-plus.configuration.map-underscore-to-camel-caseBooleantrueMyBatis-Plus starter 提供
spring.datasource.*-Boot 默认数据源,由 Boot 的 DataSourceAutoConfiguration 消费

想改分页上限(500)或方言(MySQL),只能自己定义 MybatisPlusInterceptor Bean 把默认实现顶掉。

装配条件与降级行为 ​

  • 自动配置类:com.ddk.mybatis.starter.config.MybatisPlusAutoConfiguration
  • 注册在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  • 条件:
    • @ConditionalOnClass(MybatisPlusInterceptor.class) —— classpath 上没有 mybatis-plus-extension 时整个配置类不生效。正常引入本 starter 时该类必然存在,这条基本恒真。
    • 四个 @Bean 各带 @ConditionalOnMissingBean(按 MapperProvider、IdentifierGenerator、MybatisPlusInterceptor、MetaObjectHandler 类型判定),应用自定义同类型 Bean 即可完全覆盖。
  • 没有声明 @AutoConfiguration(before/after)。MyBatis-Plus 的 MybatisPlusAutoConfiguration(com.baomidou.mybatisplus.spring.boot.autoconfigure 包下,与本类同名、仅包名不同)通过注入 List<Interceptor> 消费拦截器,本 starter 注册的插件能被拾取,不强依赖顺序;但两个同名类共存对可读性和排错都不友好。
  • 降级行为:本 starter 自身不接触数据库,三个 Bean 都能无条件创建。但引入它就带来了 mybatis-plus-spring-boot3-starter,Boot 的数据源自动配置在缺少 spring.datasource.url(且 classpath 无内嵌库)时会启动失败——这是数据源缺失导致的失败,不是本 starter 的降级路径。
  • 没有 @MapperScan,Mapper 接口的扫描要由应用自己声明(@MapperScan 或在接口上加 @Mapper)。

不适用的场景 / 已知问题 ​

  1. 方言硬编码为 MySQL。new PaginationInnerInterceptor(DbType.MYSQL) 意味着在 PostgreSQL、Oracle、达梦等库上会生成 MySQL 风格的分页 SQL。用非 MySQL 数据库必须自己覆盖 MybatisPlusInterceptor。
  2. maxLimit=500 静默截断。请求 size=1000 不会报错,会被压到 500 条返回,调用方无从感知。
  3. overflow=false 的含义要留意:页码超过总页数时返回空结果,不会回到第一页。这通常是想要的行为,但和某些前端「翻到底自动回首页」的预期不同。
  4. 自动填充依赖约定:字段名必须是 createTime / updateTime,类型必须是 LocalDateTime,且实体上要标注 @TableField(fill = FieldFill.INSERT) / INSERT_UPDATE。字段名不同(如 gmtCreate)或用 Date、Long 时,strictInsertFill 不会填充也不会报错。没有 createBy / updateBy / 租户字段的填充。
  5. 只装了分页一个插件。MyBatis-Plus 常用的乐观锁(OptimisticLockerInnerInterceptor)、防全表更新删除(BlockAttackInnerInterceptor)、多租户、动态表名都没有装,需要自己定义拦截器时要注意:一旦自定义 MybatisPlusInterceptor,分页插件也得自己重新加上。
    • 乐观锁这条值得单独注意:AggregateRoot.version() 想真正生效,需要自己装上 OptimisticLockerInnerInterceptor,并在 PO 的版本字段上标 @Version。把它装进默认配置在路线图里。
  6. 雪花 ID 使用 Hutool 默认 workerId/datacenterId(基于本机推导)。多实例部署时存在理论上的 ID 冲突风险,且没有配置项可以显式指定机器号。
  7. 无 IDE 配置提示:本 starter 没有自己的配置项,也没有 metadata 文件;全项目未引入 spring-boot-configuration-processor。
  8. 测试只覆盖装配,不覆盖硬编码参数。MybatisPlusAutoConfigurationTest 验证四个 Bean 都被注册、MapperProvider 能在单例就绪后收集到映射器、使用方的自定义 Bean 优先;但方言、maxLimit=500、填充字段名这些硬编码值本身没有断言。
  9. 多数据源场景未覆盖。与 DDK DB Starter 组合时,MyBatis-Plus 只会绑定 @Primary 数据源,其余数据源需要自己配 SqlSessionFactory,本 starter 不提供任何支持。

文章以 CC BY-NC-SA 4.0 授权 · 代码片段以 MIT 授权