MyBatis-Plus 进阶:条件构造、分页与逻辑删除
知识背景
单表 CRUD 用上 BaseMapper 后,真正高频的是:动态 WHERE、排序、分页、创建时间自动填、软删除。MP 通过 Wrapper(QueryWrapper / LambdaQueryWrapper)、分页插件、元数据处理器、@TableLogic 等统一这些模式,减少手写 if 拼接 SQL。
知识详解与通俗解释
1. 条件构造:Wrapper与 Lambda
QueryWrapper:列名用字符串,重构字段名时不如 Lambda 安全。LambdaQueryWrapper:方法引用列(如User::getAge),编译期防写错列名,推荐默认使用。
示例语义:eq、ne、gt、like、in、between、orderByDesc 等,对应 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,在 insertFill、updateFill 里对带 @TableField(fill = FieldFill.INSERT) 等字段统一赋值,避免每个 Service 手写 setGmtModified。
4. 逻辑删除:@TableLogic
标记删除字段后,delete 会变为 UPDATE 设删除标记,select 自动带 未删除条件。报表、对账若需查已删数据,要用专门接口或原生 SQL。
5. 主键策略
IdType.ASSIGN_ID(雪花)等适合分布式;与数据库自增 AUTO 按团队规范选型,和前文「UUID 主键」文章可对照阅读。
总结
- LambdaWrapper + 分页插件 覆盖多数列表接口开发。
- 自动填充、逻辑删除 减少重复与遗漏,但要清楚「隐藏 WHERE」带来的排查成本。
- 复杂场景:多数据源、动态表名、SQL 注入防护 仍需遵守 MyBatis 最佳实践。