← 返回首页
MybatisPlus基础教程(六)
发表时间:2020-03-29 13:40:18
讲解MybatisPlus的逻辑删除

1.物理删除与逻辑删除 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据。 逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。

2.实现逻辑删除步骤

1)实体类添加deleted 字段 加上 @TableLogic 注解 和 @TableField(fill = FieldFill.INSERT) 注解


@Data
@Entity
public class Users {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) //auto_increment类型
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    @TableLogic
    @TableField(fill = FieldFill.INSERT)
    private Integer deleted;
}

2)元对象处理器接口添加deleted的insert默认值

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(MyMetaObjectHandler.class);

    @Override
    public void insertFill(MetaObject metaObject) {

        LOGGER.info("start insert fill ....");
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
        this.setFieldValByName("deleted", 0, metaObject);

    }
    @Override
    public void updateFill(MetaObject metaObject) {
        LOGGER.info("start update fill ....");
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

3)在 MybatisPlusConfig 中注册 Bean. 新建config包,创建MpConfig配置类。

@Configuration
@MapperScan("com.simoniu.mpdemo.mapper")
public class MpConfig {
    //逻辑删除插件
    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }

}

4)application.properties 加入配置 此为默认值,如果你的默认值和mp默认的一样,该配置可无。

mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

5)配置控制台打印完整带参数SQL语句 为了方便测试,mybatis-plus配置控制台打印完整带参数SQL语句。

#mybatis日志,为了显示SQL语句
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

6)测试

   //测试添加单个用户资料
    @Test
    public void testInsert() {

        Users u = new Users();
       u.setName("admin");
        u.setEmail("admin@qq.com");
        u.setAge(30);
        int result = usersMapper.insert(u);
        System.out.println("受影响的记录条数是:" + result);
        System.out.println("新增记录的主键是:" + u.getId());
    }
    //测试根据ID删除
    @Test
    public void testDeleteById() {
        int result = usersMapper.deleteById(2L);

        System.out.println("受影响的记录条数是:" + result);
    }

测试后发现,新增一条数据后deleted字段默认值为0。删除一条数据后, 数据并没有被物理删除,测试后分析打印的sql语句,删除是执行一条update语句,deleted字段的值由0变成了1。

mybatisplus 3.4.0版本后,对逻辑删除做了进一步精简配置。省略了注册删除插件。具体改变如下:

1.在application.yml中配置逻辑字段和默认值。

mybatis-plus:
  global-config:
    db-config:
      #配置mybatisplus的逻辑删除功能
      logic-delete-value: false  #默认删除的值
      logic-not-delete-value: true #默认未删除的值
      logic-delete-field: flag #逻辑删除的字段名字

2.在实体类的逻辑删除字段上添加@TableLogic。

 @TableLogic //表示是逻辑删除字段
 @TableField(fill = FieldFill.INSERT)
 protected boolean flag;