第七章:mybatis-plus 逻辑删除实现

什么逻辑删除和物理删除?

逻辑删除:表示数据并未真正在数据库中被删除掉,在系统中查询不到,但在数据库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

从以上测试中可以看出启用逻辑删除后并未真正的从数据库删除,只是打上删除标记位

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值