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