八、MybatisPlus实现逻辑删除

delete

在这里插入图片描述

1、根据id删除记录

//删除操作,物理删除
    @Test
    public void testDeleteById() {
        int i = userMapper.deleteById(1L);
        System.out.println(i);

    }

2、批量删除

   @Test    public void testDeleteBatchIds() {        int result = userMapper.deleteBatchIds(Arrays.asList(8, 9, 10));        System.out.println(result);    }

3、简单的条件查询删除

@Testpublic void testDeleteByMap() {    HashMap<String, Object> map = new HashMap<>();    map.put("name", "Helen");    map.put("age", 18);    int result = userMapper.deleteByMap(map);    System.out.println(result);}

4、逻辑删除

  • 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据
  • 逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
(1)数据库中添加 deleted字段
ALTER TABLE `user` ADD COLUMN `deleted` boolean

在这里插入图片描述

(2)实体类添加deleted字段

并加上 @TableLogic 注解 和 @TableField(fill = FieldFill.INSERT) 注解(字段default和自动填充只能二选一

 @TableLogic    @TableField(fill = FieldFill.INSERT)    private Integer deleted;
(3)元对象处理器接口添加deleted的insert默认值
package com.phoenix.mpdemo.handler;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;import org.apache.ibatis.reflection.MetaObject;import org.springframework.stereotype.Component;import java.util.Date;@Componentpublic class MyMetaObjectHandler implements MetaObjectHandler {    //使用mp实现添加操作,这个方法执行    @Override    public void insertFill(MetaObject metaObject) {        this.setFieldValByName("createTime", new Date(), metaObject);        this.setFieldValByName("updateTime", new Date(), metaObject);        this.setFieldValByName("version", 1, metaObject);        this.setFieldValByName("deleted",0,metaObject);    }    //使用mp实现修改操作,这个方法执行    @Override    public void updateFill(MetaObject metaObject) {        this.setFieldValByName("updateTime", new Date(), metaObject);    }}
(4)application.properties 加入配置
#逻辑删除mybatis-plus.global-config.db-config.logic-delete-value=1mybatis-plus.global-config.db-config.logic-not-delete-value=0
(5)在 MybatisPlusConfig 中注册 Bean

配置插件

package com.phoenix.mpdemo.config;import com.baomidou.mybatisplus.core.injector.ISqlInjector;import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;import org.mybatis.spring.annotation.MapperScan;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configuration@MapperScan("com.phoenix.mpdemo.mapper")public class Mpconfig {    /**     * 乐观锁插件     */    @Bean    public OptimisticLockerInterceptor optimisticLockerInterceptor() {        return new OptimisticLockerInterceptor();    }    /**     * 分页插件     */    @Bean    public PaginationInterceptor paginationInterceptor() {        return new PaginationInterceptor();    }    /*     * 逻辑删除插件     * */    @Bean    public ISqlInjector sqlInjector() {        return new LogicSqlInjector();    }}

(6)测试逻辑删除

  • 测试后发现,数据并没有被删除,deleted字段的值由0变成了1
  • 测试后分析打印的sql语句,是一条update
  • **注意:**被删除数据的deleted 字段的值必须是 0,才能被选取出来执行逻辑删除的操作
//逻辑删除    @Test    public void testLogicDelete(){        int i = userMapper.deleteById(1334110923614412802L);        System.out.println(i);    }

在这里插入图片描述

(7)测试逻辑删除后的查询

MyBatis Plus中查询操作也会自动添加逻辑删除字段的判断

//查询    @Test    public void testLogicDeleteSelect(){        List<User> users=userMapper.selectList(null);      System.out.println(users);            }

测试后分析打印的sql语句,包含 WHERE deleted=0

SELECT id,name,age,email,create_time,update_time,deleted FROM user WHERE deleted=0

在这里插入图片描述


版权声明:本文为weixin_43555997原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。