问题描述
在使用MyBatis-Plus进行逻辑删除操作时,遇到了一个问题:执行 xxxService.removeById(id)
方法进行逻辑删除时,发现控制台打印的SQL语句没有自动填充 updateTime
和 updateBy
字段。
配置与实体类定义
配置文件
mybatis-plus:
configuration:
call-setters-on-nulls: true
mapper-locations: classpath:mapper/*.xml,classpath*:mapper/*/*.xml
global-config:
db-config:
logic-delete-field: is_deleted
logic-delete-value: 1
logic-not-delete-value: 0
实体类定义
public class SomeEntity {
// ...其他字段...
@TableLogic
private int isDeleted;
@TableField(fill = FieldFill.UPDATE, jdbcType = JdbcType.VARCHAR)
private String updateTime;
@TableField(fill = FieldFill.UPDATE, jdbcType = JdbcType.VARCHAR)
private String updateBy;
}
问题分析与解决方案
使用场景
MyBatis-Plus的逻辑删除功能(@TableLogic
注解)适用于简单的逻辑删除操作,即仅需要修改 isDeleted
字段的情况。在这种场景下,使用MyBatis-Plus自带的逻辑删除功能是合适的,因为它简化了代码并直接支持逻辑删除。
自动填充失效问题
当需要在逻辑删除时同时更新其他字段(例如 updateTime
和 updateBy
)时,直接使用实体类更新方法无法触发 isDeleted
字段的更新,只会单独更新自动填充的updateTime
和updateBy
字段:
public DataResult delete(@RequestParam String id){
SewagePipelines sewagePipelines = new SewagePipelines();
sewagePipelines.setId(id);
sewagePipelines.setIsDeleted(1);
sewagePipelinesService.updateById(sewagePipelines);
return DataResult.success();
}
推荐的解决方法
为了确保 isDeleted
以及 updateTime
和 updateBy
字段同时被更新,推荐使用 UpdateWrapper
方法:
UpdateWrapper<SewagePipelines> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", id)
.set("is_deleted", 1)
.set("update_time", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
sewagePipelinesService.update(updateWrapper);
结论
在使用MyBatis-Plus进行逻辑删除时,如果仅修改 isDeleted
字段,则使用框架自带的逻辑删除功能是合适的。然而,如果需要在逻辑删除时更新其他字段(如 updateTime
和 updateBy
),则建议手工维护删除和查询(即删除代码改写为update语句,查询代码指定isDeleted=0),避免依赖于可能不触发的自动填充功能。