什么是逻辑删除
假删除、逻辑删除,并不会真正的从数据库中将数据删除掉,而是将当前被删除的
这条数据的一个逻辑字段置为删除状态。
实现
全局配置注入LogicSqlInjector
打开项目的applicationContext.xml
<!-- 配置逻辑删除 -->
<bean id="logicSqlInjector" class="com.baomidou.mybatisplus.mapper.LogicSqlInjector"></bean>
然后在全局策略配置中注入
<!-- 定义MybatisPlus的全局策略配置-->
<bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!-- 在2.3版本以后,dbColumnUnderline 默认值就是true 开启下划线到驼峰命名支持-->
<property name="dbColumnUnderline" value="true"></property>
<!-- 全局的主键策略 全局使用主键自增的方式 value为 0-->
<property name="idType" value="0"></property>
<!-- 全局的表前缀策略配置 -->
<!-- <property name="tablePrefix" value="tbl_"></property> -->
<!-- 注入自定义全局操作 -->
<!-- <property name="sqlInjector" ref="mySqlInjector"></property> -->
<!-- 注入逻辑删除-->
<property name="sqlInjector" ref="logicSqlInjector" />
<!-- 注入逻辑删除全局值-->
<property name="logicDeleteValue" value="1" />
<property name="logicNotDeleteValue" value="0" />
</bean>
注:
logicDeleteValue // 逻辑删除全局值
logicNotDeleteValue // 逻辑未删除全局值
添加logic字段
数据库中添加logic字段
对应实体类添加字段
@TableLogic
private Integer logicFlag;//逻辑删除
添加注解@TableLogic并生成get和set方法。
完整实体类
package com.badao.beans;
import java.io.Serializable;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableLogic;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.annotations.Version;
import com.baomidou.mybatisplus.enums.IdType;
import com.mchange.util.FailSuppressedMessageLogger;
@TableName(value="employee")
public class Employee extends Model<Model>{
@TableId(value="id",type=IdType.AUTO)
private Integer id;
//@TableField(value="last_name")
private String name;
private String email;
private Integer gender;
private Integer age;
@TableField(exist=false)
private String remark;
@Version
private Integer version;
@TableLogic
private Integer logicFlag;//逻辑删除
public Integer getVersion() {
return version;
}
public Integer getLogicFlag() {
return logicFlag;
}
public void setLogicFlag(Integer logicFlag) {
this.logicFlag = logicFlag;
}
public void setVersion(Integer version) {
this.version = version;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
/***
* 必须指定当前实体类的主键属性
*/
@Override
protected Serializable pkVal() {
// TODO Auto-generated method stub
return id;
}
}
测试
编写测试方法
/***
* 逻辑删除
*/
@Test
public void testlogicdelete() {
int result = employeeMapper.deleteById(24);
System.out.println("***********"+result);
}
效果
会在mp自带查询和更新方法的sql后面,追加『逻辑删除字段』=『LogicNotDeleteValue默认值』 删除方法: deleteById()和其他delete方法, 底层SQL调用的是update tbl_xxx set 『逻辑删除字段』=『logicDeleteValue默认值』
此时再查看数据库,逻辑删除字段已经变为1。
此时修改测试方法查询id为24的实体类。
/***
* 逻辑删除
*/
@Test
public void testlogicdelete() {
/*int result = employeeMapper.deleteById(24);
System.out.println("***********"+result);*/
Employee employee =employeeMapper.selectById(24);
System.out.println(employee);
}
已经查询不到了。