什么逻辑删除和物理删除?
逻辑删除:表示数据并未真正在数据库中被删除掉,在系统中查询不到,但在数据库TABLE中可以查询到
物理删除:表示数据真正删掉,不管是在系统中还是数据库TABLE都不能查询到。
逻辑删除的优点是如果哪一天数据被删除了又想恢复了,还是可以,但是物理删除就没有办法恢复。
逻辑删除实现方式
通过以上概念逻辑删除后在应用系统无法查询出来,最简单的方式就是TABLE层面通过一个字段来区分,在数据查询时对这个字段下条件,比如0表未删除,1表示已删除。
Mybatis-Plus如何实现呢?
方式一:
通过增加实体类上注解@TableLogic来标记
@TableLogic(value = "0",delval = "1")
其中delval表示逻辑删除标记,value表示未逻辑删除标记
方式二:
增加全局配置方式,指明逻辑删除标记字段deleted
mybatis-plus:
mapper-locations: classpath*:/mapper/*.xml
global-config:
db-config:
logic-not-delete-value: 0
logic-delete-value: 1
logic-delete-field: deleted
以上方式中方式一和方二都配置了话方式优先于方式二,一般不建议采用方式一,因为每个实体类都需要增加@TableLogic太麻烦
以下是具体代码采用方式二
1.准备user类
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
@Data
public class User extends Model<User> {
private Long id;
private String name;
private Integer age;
private String email;
private int deleted;
}
2.准备mapper类
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mesui.service.data.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserMapper extends BaseMapper<User> {
@Select("select * from user ${ew.customSqlSegment}")
List<User> selectAllUser(@Param(Constants.WRAPPER)Wrapper<User> wrapper);
List<User> selectUsers(@Param(Constants.WRAPPER)Wrapper<User> wrapper);
IPage<User> selectUserPage(Page<User> page,@Param(Constants.WRAPPER)Wrapper<User> wrapper);
}
3.springboot mybatis-plus配置
mybatis-plus:
mapper-locations: classpath*:/mapper/*.xml
global-config:
db-config:
logic-not-delete-value: 0
logic-delete-value: 1
logic-delete-field: deleted
4.准备insert测试方法
@Test
public void testSave(){
for(long i=10;i<20;i++) {
User user = new User();
user.setId(300+i);
user.setAge((int)i+30);
user.setEmail("zoulinlin"+i+"@163.com");
user.setName("zouli"+i);
int row = userMapper.insert(user);
System.out.println(row);
}
}
运行log:
2022-10-09 19:00:25.563 DEBUG 21748 --- [ main] c.m.service.mapper.UserMapper.insert : ==> Preparing: INSERT INTO user ( id, name, age, email, deleted ) VALUES ( ?, ?, ?, ?, ? )
2022-10-09 19:00:25.583 DEBUG 21748 --- [ main] c.m.service.mapper.UserMapper.insert : ==> Parameters: 310(Long), zouli10(String), 40(Integer), zoulinlin10@163.com(String), 0(Integer)
2022-10-09 19:00:25.623 DEBUG 21748 --- [ main] c.m.service.mapper.UserMapper.insert : <== Updates: 1
1
2022-10-09 19:00:25.633 DEBUG 21748 --- [ main] c.m.service.mapper.UserMapper.insert : ==> Preparing: INSERT INTO user ( id, name, age, email, deleted ) VALUES ( ?, ?, ?, ?, ? )
2022-10-09 19:00:25.633 DEBUG 21748 --- [ main] c.m.service.mapper.UserMapper.insert : ==> Parameters: 311(Long), zouli11(String), 41(Integer), zoulinlin11@163.com(String), 0(Integer)
2022-10-09 19:00:25.674 DEBUG 21748 --- [ main] c.m.service.mapper.UserMapper.insert : <== Updates: 1
1
5.准备delete测试方法@Test
@Test
public void testDelete(){
userMapper.deleteById(1);
}
运行log:
2022-10-09 19:05:42.875 DEBUG 22104 --- [ main] c.m.s.mapper.UserMapper.deleteById : ==> Preparing: UPDATE user SET deleted=1 WHERE id=? AND deleted=0
2022-10-09 19:05:42.895 DEBUG 22104 --- [ main] c.m.s.mapper.UserMapper.deleteById : ==> Parameters: 1(Integer)
2022-10-09 19:05:43.025 DEBUG 22104 --- [ main] c.m.s.mapper.UserMapper.deleteById : <== Updates: 1
从以上测试中可以看出启用逻辑删除后并未真正的从数据库删除,只是打上删除标记位