大家好,又见面了,我是你们的朋友全栈君。
**
MybatisPlus——逻辑删除
** 首先我们要知道为什么要进行逻辑删除: 逻辑删除可以理解为假删除,并不是真的将数据进行删除。
假删除只是为了数据安全起见,在数据库中增添一个字段,我们可以默认这个字段为1时数据被删除,而字段值为0时数据被删除
逻辑删除是为了方便数据恢复和保护数据本身价值的一种方案。我们电脑里的回收站正是利用了逻辑删除,我们点击删除的文件不会被立刻删除,而是放入回收站,等我们反悔时可以将其进行还原。
在MybatisPlus中设置逻辑删除有以下几个步骤
1.首先为Strudent表添加logic_delete字段,通过判断logic_delete字段的数值,我们可以确定数据是否已被删除
2.如果logic_delete字段在数据库中并没有设置默认值(推荐设置默认值,这样更加方便),我们需要在applicationContext.xml文件中对默认值进行设置,已设置默认值可跳过此步
代码语言:javascript复制 <bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<!--配置globalConfig,在全局中对默认值进行设置-->
<property name="globalConfig" ref="globalConfig"></property>
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis.xml"></property>
<property name="typeAliasesPackage" value="com.yq.entity"></property>
</bean>
代码语言:javascript复制 <bean id="globalConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
<property name="dbConfig">
<bean class="com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig">
<!-默认被删除为1-->
<property name="logicDeleteValue" value="1"></property>
<!-默认未被删除为0-->
<property name="logicNotDeleteValue" value="0"></property>
</bean>
</property>
</bean>
3.实体类属性与表中字段保持一致,属性 logicDelete添加@TableLogic注解
代码语言:javascript复制package com.yq.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
public class Student extends Model<Student> {
@TableId(type = IdType.AUTO)
private int stuNo;
private String stuName;
@Version
private Integer version;
private int stuAge;
//逻辑删除字段
@TableLogic
private Integer logicDelete;//这里用Integer默认为null,而int默认为0,0会产生误解
public Student(int stuNo, String stuName, Integer version, int stuAge) {
this.stuNo = stuNo;
this.stuName = stuName;
this.version = version;
this.stuAge = stuAge;
}
public Student(int stuNo, String stuName, int stuAge) {
this.stuNo = stuNo;
this.stuName = stuName;
this.stuAge = stuAge;
}
public Student(String stuName, int stuAge) {
this.stuName = stuName;
this.stuAge = stuAge;
}
public Student() {
}
public int getStuNo() {
return stuNo;
}
public void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getStuAge() {
return stuAge;
}
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
public Integer getLogicDelete() {
return logicDelete;
}
public void setLogicDelete(Integer logicDelete) {
this.logicDelete = logicDelete;
}
}
4.进行简单调用,查看结果
代码语言:javascript复制 //测试假删
public static void testLogicdelete(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
StudentMapper studentMapper = context.getBean("studentMapper", StudentMapper.class);
studentMapper.delete(null);
}
public static void main(String[] args) throws Exception {
testLogicdelete();
}
执行方法之前的数据库表:
执行方法之后的数据库表:
此时我们查看日志发现 我们原本执行的删除语句(delete from student ):
在日志中变为对logic_delete字段的更新操作:
执行删除语句后数据并没有被直接删除,而且MybatisPlus自动将logic_delete字段的值更新为1,使其处于假删状态,保证了数据安全。
当我们数据库中所有数据的字段logic_delete为1,也就是被删除时,我们进行查询全部操作,发现 select * from student语句被转换为 SELECT stu_no,stu_name,version,stu_age,logic_delete FROM student WHERE logic_delete=0
MybatisPlus为我们自动进行了拼接操作将 WHERE logic_delete=0 在查询语句后进行拼接,以保证我们只能查询出 logic_delete=0 ,也就是未被删除的数据
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/137607.html原文链接:https://javaforall.cn