mybatis-plus通过逻辑删除和自动填充机制减少模板代码:逻辑删除配置logic-delete-field并用@tablelogic标注字段,实现软删与查询过滤;自动填充通过metaobjecthandler配合@tablefield(fill = ...)完成创建/更新时间及操作人自动赋值。

MyBatis-Plus 通过内置的逻辑删除和自动填充机制,能大幅减少模板代码。关键在于正确配置全局策略、实体字段标注,以及确保数据库字段与 Java 属性对齐。
逻辑删除:配置 + 字段标注
逻辑删除不是真删数据,而是将某字段(如 is_deleted)设为标记值(如 1),查询时自动过滤已“删除”的记录。
- 在 application.yml 中启用并配置逻辑删除字段和值:
- 在实体类对应字段上加 @TableLogic 注解(推荐加在 Boolean/Integer 类型字段上):
- 执行
userMapper.deleteById(123)时,MP 自动生成UPDATE user SET is_deleted = 1 WHERE id = 123 AND is_deleted = 0 - 所有
selectList、getById等查询默认追加AND is_deleted = 0条件(除非显式调用query.lambda().eq(User::getIsDeleted, 1))
自动填充:MetaObjectHandler + 字段注解
用于自动设置创建人、创建时间、更新人、更新时间等字段,避免手动赋值。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 定义处理器类,继承 MetaObjectHandler,重写插入/更新时的填充逻辑:
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictUpdateFill(metaObject, "updateBy", Long.class, 1L);
}
}
- 在实体字段上添加 @TableField(fill = FieldFill.INSERT) 等注解:
- 注意:
strictInsertFill和strictUpdateFill会严格按字段名、类型匹配;若字段是Long但想填当前用户 ID,需确保你能在 handler 中获取到该上下文(如从 ThreadLocal 或 SecurityContext) - 实际项目中,
createBy/updateBy通常来自登录用户,建议封装工具类统一从认证上下文提取
组合使用注意事项
逻辑删除与自动填充可共存,但要注意行为边界:
-
removeById是逻辑删除,触发updateFill(因为本质是 UPDATE),所以updateTime和updateBy会被自动填充 -
updateById不影响isDeleted字段,除非你显式设置它 - 若需物理删除(绕过逻辑删除),用
delete方法配合 Wrapper,并禁用逻辑删除条件:lambdaQuery().setEntity(new User()).eq(User::getId, 123).last("LIMIT 1")不推荐;更稳妥是自定义 Mapper XML 或使用baseMapper.deleteBatchIds配合@SqlParser(filter = true)
验证是否生效的小技巧
开启 MP SQL 日志,观察生成的语句:
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl- 执行删除后,看日志是否出现
SET is_deleted = 1 - 执行新增后,查数据库确认
createTime是否非空且为当前时间 - 执行更新后,检查
updateTime是否被刷新、isDeleted是否保持原值
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










