八、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版权协议,转载请附上原文出处链接和本声明。