方向上完全同意,我只想在你那条「SQL 片段」的基础上把反作用条件补齐——这招好用,但改完别忘了另外三处得同步。
deleted 配成 UNIX_TIMESTAMP() 或 id 之后:字段类型得从 tinyint 改成 bigint,实体里的 Integer deleted 也要跟着改,不然后面比较会隐式转换出玄学问题;logic-not-delete-value 必须仍是 0,只动 delete-value,否则 select 的追加条件就废了。唯一索引依然得建成「业务键 + deleted」联合唯一,只是删除后旧行的 deleted 变成时间戳或 id,不再和新的未删除行(deleted=0)打架。同一秒批量删的场景用 UNIX_TIMESTAMP() 仍可能撞,真在意唯一性还是用 id。
XML / @Select 那段我再加一类:count、exists、@SelectProvider 以及关联子查询统统不走自动注入,统计和关联场景是逻辑删除漏数据最集中的地方,建议直接在表别名上统一写 t.deleted = 0,别指望 MP。
乐观锁叠逻辑删除有个后果:update 会同时带 version 和 deleted=0,返回 0 行时你分不清是版本冲突还是记录已被删,别在代码里硬区分,业务提示统一成「数据已变更或不存在,请刷新重试」最省事。
分页再补一个:optimizeCountSql 默认 true,遇到 group by/distinct 会自动优化 count,结果经常偏小,这种列表我是直接关掉的;maxLimit 超限的行为是截断到上限而不是报错,别指望它帮你拦异常。
最后,JDK8 的项目拉 jsqlparser 依赖要挑 -4.9 那个分支,5.x 的版本起不来。
正式会员
认证极客






