MyBatis Plus
continew-starter-data-mp:基于 MyBatis Plus 的数据访问增强,含扩展配置、@Query 通用查询、通用 Mapper/Service 与拦截器、P6Spy、ID 生成器等插件能力。
continew-starter-data-mp 是数据访问模块针对 MyBatis Plus 框架的增强实现。
引入依赖
<dependency>
<groupId>top.continew.starter</groupId>
<artifactId>continew-starter-data-mp</artifactId>
</dependency>模块会传递引入 com.baomidou:mybatis-plus-spring-boot3-starter、com.baomidou:mybatis-plus-jsqlparser 与 p6spy:p6spy;me.ahoo.cosid:cosid-spring-boot-starter 为 optional,仅当 ID 生成器类型选择 COSID 时需要自行引入(见 continew-starter-data-mp/pom.xml)。
配置
扩展配置项前缀为 mybatis-plus.extension,属性类为 top.continew.starter.data.autoconfigure.MyBatisPlusExtensionProperties:
| 配置项 | 说明 | 默认值 |
|---|---|---|
mybatis-plus.extension.enabled | 是否启用本模块扩展(自动配置生效条件,见 MybatisPlusAutoConfiguration.java:53) | false |
mybatis-plus.extension.id-generator.type | ID 生成器类型:DEFAULT(雪花算法,基于网卡信息绑定防止集群重复)、COSID、CUSTOM | DEFAULT |
mybatis-plus.extension.pagination.enabled | 是否启用分页插件 | true |
mybatis-plus.extension.pagination.db-type | 分页数据库类型(com.baomidou.mybatisplus.annotation.DbType,如 MYSQL) | 未设置 |
mybatis-plus.extension.pagination.overflow | 分页溢出处理(页码超出总页数时回到第一页) | false |
mybatis-plus.extension.pagination.max-limit | 单页分页条数限制,-1 表示无限制 | -1 |
mybatis-plus.extension.optimistic-locker-enabled | 是否启用乐观锁插件(OptimisticLockerInnerInterceptor) | false |
mybatis-plus.extension.block-attack-plugin-enabled | 是否启用防全表更新与删除插件(BlockAttackInnerInterceptor) | true |
# MyBatis Plus 扩展配置
mybatis-plus:
extension:
enabled: true
# ID 生成器配置
id-generator:
type: COSID
# 分页插件配置
pagination:
enabled: true
db-type: MYSQL
# 乐观锁插件
optimistic-locker-enabled: true
# Mapper XML 文件目录配置
mapper-locations: classpath*:/mapper/**/*Mapper.xml
# 类型别名扫描包配置
type-aliases-package: ${application.base-package}.**.model启用扩展时,模块还会通过 default-data-mybatis-plus.yml 提供一组样板化默认配置(如需修改,在 application.yml 中同名覆盖即可):
mybatis-plus:
# 启动时是否检查 MyBatis XML 文件的存在(默认 false 不检查)
check-config-location: true
configuration:
# 开启自动驼峰命名规则映射
map-underscore-to-camel-case: true
# 自动映射时未知列/属性处理策略:NONE 不处理;WARNING 打印警告;FAILING 抛出异常
auto-mapping-unknown-column-behavior: NONE
# 关闭 MyBatis 自带日志,统一使用 P6Spy 输出 SQL
log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl通用查询注解
在查询条件类的字段上标注 @Query 注解,即可通过 QueryWrapperHelper.build(query) 构建查询条件,免去手写 QueryWrapper 拼接:
@Data
public class DeptQuery implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 部门名称
*/
private String name;
/**
* 状态
*/
private Integer status;
}
// 手动拼接查询条件
LambdaQueryWrapper<DeptDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(query.getName()), DeptDO::getName, query.getName());
queryWrapper.eq(null != query.getStatus(), DeptDO::getStatus, query.getStatus());@Query 注解属性(top.continew.starter.data.annotation.Query):
| 属性 | 说明 | 默认值 |
|---|---|---|
columns | 数据库列名(非实体字段名,关键字需用转义符包裹)。为空时取字段名并自动转下划线命名;配置多列时多列条件间为或关系 | {} |
type | 查询类型 | QueryType.EQ |
logicalRelation | 多列查询时的逻辑关系(仅 columns 长度大于 1 时生效),可选 AND / OR | OR |
查询类型枚举 top.continew.starter.data.enums.QueryType:
| 类型 | 描述 | SQL 示例 |
|---|---|---|
EQ | 等于 | WHERE age = 18 |
NE | 不等于 | WHERE age != 18 |
GT | 大于 | WHERE age > 18 |
GE | 大于等于 | WHERE age >= 18 |
LT | 小于 | WHERE age < 18 |
LE | 小于等于 | WHERE age <= 18 |
BETWEEN | 范围查询 | WHERE age BETWEEN 10 AND 18 |
LIKE | 模糊查询 | WHERE nickname LIKE '%s%' |
LIKE_LEFT | 左模糊查询 | WHERE nickname LIKE '%s' |
LIKE_RIGHT | 右模糊查询 | WHERE nickname LIKE 's%' |
IN | 包含查询 | WHERE age IN (10, 20, 30) |
NOT_IN | 不包含查询 | WHERE age NOT IN (20, 30) |
IS_NULL | 空值查询 | WHERE email IS NULL |
IS_NOT_NULL | 非空查询 | WHERE email IS NOT NULL |
通用 Mapper 与 Service
继承模块提供的 BaseMapper(top.continew.starter.data.mapper.BaseMapper)与 IService / ServiceImpl,在 MyBatis Plus 默认能力之上额外获得批量与链式方法:
public interface DemoMapper extends BaseMapper<DemoDO> {
}
public interface DemoService extends IService<DemoDO> {
}
@Service
public class DemoServiceImpl extends ServiceImpl<DemoMapper, DemoDO> implements DemoService {
}BaseMapper 扩展方法(BaseMapper.java:46-113):insertBatch(批量插入)、updateBatchById(批量更新)、query / lambdaQuery(链式查询)、update / lambdaUpdate(链式更新)、currentEntityClass(获取实体类 Class)。
插件与扩展能力
- 拦截器自动注入:Spring 容器中所有
InnerInterceptorBean 会自动注入MybatisPlusInterceptor,再依次追加分页、乐观锁、防全表更新删除插件(见MybatisPlusAutoConfiguration.java:79-103)。 BaseEnum枚举支持:通过MybatisPlusPropertiesCustomizer将默认枚举 TypeHandler 设置为CompositeBaseEnumTypeHandler,实现BaseEnum接口的枚举按getValue()值入库,无需逐个标注(MybatisPlusAutoConfiguration.java:68-72)。- P6Spy SQL 分析:内置
spy.properties,默认输出 SQL 到控制台、记录超过 2 秒的慢 SQL(outagedetectioninterval=2),并排除SELECT 1等心跳语句;配合log-impl: NoLoggingImpl可避免 MyBatis 日志与 P6Spy 重复输出。 - ID 生成器:
type为COSID时需自行引入cosid-spring-boot-starter;为CUSTOM时必须自行提供IdentifierGeneratorBean,否则启动时报NoSuchBeanDefinitionException(MyBatisPlusIdGeneratorConfiguration.java:84-109)。
2.13 → 4.0 升级须知
本模块传递的 CosId 版本已随 3.0.0 升至 4.0.2。type: COSID 的装配行为不变(仍注入内置共享 Bean __share__SnowflakeId 生成分布式 ID),使用方须知集中在机器号分配:
- 容器部署建议配置固定 instance-id:CosId 4.0 起会检测容器环境,未配置
cosid.machine.instance-id时输出 WARN 并建议在容器内配置cosid.machine.instance-id: ${HOSTNAME}与cosid.machine.stable: true,避免每次重启占用新的机器号(10bit 机器号上限 1024)。虚拟机部署不受影响,默认行为(进程 ID 参与实例标识)与 2.x 一致。 - provider API 编码形态:
IdGeneratorProvider.get(String)/getRequired(String)的返回类型从IdGenerator收窄为父接口StringIdGenerator,链式调用generateAsString()与getShare()不受影响,但不要再把返回值赋回IdGenerator类型变量后调用generate(),该写法 4.0 编译不过。
机器号分配机制本身由 CosId starter 承担,本模块无相关配置键。开启机器号守护(cosid.machine.guarder.enabled: true)的系统升级后无需清理 Redis 中的机器号记录。
请通过 @MapperScan 注解在启动类(或配置类)上显式指定 Mapper 接口扫描包路径:
@MapperScan("top.continew.admin.**.mapper")
@SpringBootApplication
public class ExampleApplication {
public static void main(String[] args) {
SpringApplication.run(ExampleApplication.class, args);
}
}4.0 → 4.1 升级须知
本模块传递的 CosId 版本已随 3.1.0 升至 4.1.1。type: COSID 的装配行为不变(仍注入内置共享 Bean __share__SnowflakeId 生成分布式 ID)。
- segment 生成器并发跳段缺陷已修复:CosId 4.0.2 引入的缺陷在并发取号时会让部分号段的 ID 永不发放(浪费但不重复,CosId #1299),4.1.0 已修复。使用 segment 生成器的项目随本次升级获得修复,无需调整配置。
- 存储模块不再传递 Guava:自行引入
cosid-jdbc、cosid-spring-redis或cosid-mongo的项目,4.1.0 起这些模块不再传递 Guava(CosId #1271),代码用到 Guava 的需自行声明com.google.guava:guava;cosid-zookeeper经 Apache Curator 仍会带入 Guava。 - 预取 worker 停机钩子在 starter 下默认关闭:
cosid.segment.chain.prefetch-worker.shutdown-hook在 starter 下自 4.1.1 默认变为false(CosId #1302),停机时预取 worker 改由 Spring lifecycle 在 web server 排空后停止,需提前停止的容器化部署可设回true。
核心依赖
| 依赖 | 描述 |
|---|---|
top.continew.starter:continew-starter-data-core | 数据访问模块 - 核心模块(@Query 查询注解体系) |
com.baomidou:mybatis-plus-spring-boot3-starter | MyBatis Plus 框架本体 |
com.baomidou:mybatis-plus-jsqlparser | MyBatis Plus jsqlparser 适配(分页等插件依赖) |
p6spy:p6spy | P6Spy SQL 性能分析组件 |
me.ahoo.cosid:cosid-spring-boot-starter | CosId 分布式 ID 生成器(optional,按需引入) |