Skip to content

MyBatis-Plus 进阶:条件构造、分页与逻辑删除

知识背景

单表 CRUD 用上 BaseMapper 后,真正高频的是:动态 WHERE、排序、分页、创建时间自动填、软删除。MP 通过 Wrapper(QueryWrapper / LambdaQueryWrapper分页插件元数据处理器@TableLogic 等统一这些模式,减少手写 if 拼接 SQL。


知识详解与通俗解释

1. 条件构造:Wrapper与 Lambda

  • QueryWrapper:列名用字符串,重构字段名时不如 Lambda 安全。
  • LambdaQueryWrapper:方法引用列(如 User::getAge),编译期防写错列名,推荐默认使用。

示例语义:eqnegtlikeinbetweenorderByDesc 等,对应 SQL 片段由 MP 生成。

通俗说:把「拼 WHERE 字符串」换成「链式调方法」,可读性接近 QueryDSL。

2. 分页:PaginationInnerInterceptor

在 MyBatis 配置中注册 分页插件(MySQL 通常用分页方言 DbType.MYSQL)。业务里 Page<User> page = new Page<>(current, size),再 mapper.selectPage(page, wrapper),即可得到 records + total

注意:深度分页offset 极大)在 MySQL 里本身成本高,MP 只负责正确拼 SQL,性能仍要靠索引与业务改造(如游标翻页)。

3. 自动填充:创建时间 / 更新时间

实现 MetaObjectHandler,在 insertFillupdateFill 里对带 @TableField(fill = FieldFill.INSERT) 等字段统一赋值,避免每个 Service 手写 setGmtModified

4. 逻辑删除:@TableLogic

标记删除字段后,delete 会变为 UPDATE 设删除标记select 自动带 未删除条件。报表、对账若需查已删数据,要用专门接口或原生 SQL。

5. 主键策略

IdType.ASSIGN_ID(雪花)等适合分布式;与数据库自增 AUTO 按团队规范选型,和前文「UUID 主键」文章可对照阅读。


总结

  • LambdaWrapper + 分页插件 覆盖多数列表接口开发。
  • 自动填充、逻辑删除 减少重复与遗漏,但要清楚「隐藏 WHERE」带来的排查成本。
  • 复杂场景:多数据源、动态表名、SQL 注入防护 仍需遵守 MyBatis 最佳实践。