MyBatis-Plus 逻辑删除无法自动填充

447 阅读1分钟

1. 问题描述

我是用的 MyBatis 版本为 2.2.1,MyBatis-Plus 版本为 3.4.3.4。

问题描述:在进行逻辑删除的时候(也就是更新 deleted = 1),update_time 字段没有被自动填充更新。

2. 解决问题

下面添加的代码配置是为了解决这个问题的。直接上代码。

package com.gtcom.backstage.injector;

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.extension.injector.methods.LogicDeleteByIdWithFill;

import java.util.List;

public class MySqlInjector extends DefaultSqlInjector {

    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
        //继承原有方法
        List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
        //注入新方法
        methodList.add(new LogicDeleteByIdWithFill());
        return methodList;
    }
}
package com.gtcom.backstage.configuration;

import com.gtcom.backstage.injector.MySqlInjector;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisPlusConfig {

    @Bean
    public MySqlInjector sqlInjectorPlus() {
        return new MySqlInjector();
    }
}
package com.gtcom.backstage.injector;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface MyBaseMapper<T> extends BaseMapper<T> {

    /**
     * 根据主键删除,并且自动填充
     *
     * @param entity 请求实体
     * @return 更新记录数
     */
    int deleteByIdWithFill(T entity);
}

这里注意直接继承 MyBaseMapper,而不是 MyBatis-Plus 提供的 BaseMapper。

package com.gtcom.backstage.mapper;

import com.gtcom.backstage.entity.OutputUser;
import com.gtcom.backstage.injector.MyBaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface OutputUserMapper extends MyBaseMapper<OutputUser> {
}

具体调用代码:

OutputUser outputUserForUpdate = new OutputUser();
outputUserForUpdate.setId(userId);
outputUserMapper.deleteByIdWithFill(outputUserForUpdate);

执行的 SQL:

UPDATE output_user SET update_time = ?, deleted = 1 WHERE id = ? AND deleted = 0

可以看出 update_time 字段已经被自动填充上了。

3. 参考资料

官方文档关于逻辑删除的描述

Gitee官方示例代码

mybatis-plus 逻辑删除无法做自动填充的问题

在这里插入图片描述

可以看到 3.5.0 版本后,官方已经实现了这个功能,不需要做这个配置了。

具体调用代码:

OutputUser outputUserForUpdate = new OutputUser();
outputUserForUpdate.setId(userId);
outputUserMapper.deleteById(outputUserForUpdate);

但是下面的写法还是不能自动填充 update_time 字段的:

outputUserMapper.deleteById(userId);