程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

MyBatisPlus之逻辑删除

发布于2022-08-02 01:40     阅读(1283)     评论(0)     点赞(13)     收藏(0)


在日常开发过程中,我们经常会遇见要求移除某个对象,可是不删除数据库中的数据,以便进行数据恢复。这时候我们就会想到逻辑删除而非物理删除

一、何为逻辑删除?

逻辑删除是指文件或者数据没有被真正的删除,只不过通过对数据进行标注,从而让数据无法被识别到。通常这种删除操作是可逆的,就是说用适当的工具或软件可以把删除的文件或者数据恢复出来。

二、常规逻辑删除

常规逻辑删除即就是在数据库表中加一个字段is_delete字段,is_delete字段的值为0表示数据未删除,值为1表示数据已经删除。

插入数据数据时,这个值默认为0。删除数据时将这个值设置为1。查询和更新数据时都将‘is_delete=0’这个条件带上,只查询和更新没有删除的数据。

这个方案比较简单,但是会有些问题。比如说你表中的一个字段user_name设置了唯一性约束,但是如果你只是进行了逻辑删除的话,相同的user_name就不能进行数据插入了。

但如果不将该字段设置为唯一性约束的,那么在每次插入数据的时候,都需先进行一次查询,看看有无未(逻辑)删除的同名记录存在,低效率是一回事,而且在高并发的系统中,很难保证其正确性。

所以在我们使用常规的逻辑删除方案时,我们需要考虑的东西就会变得很多。因此为了提高我们的效率,更加推荐使用MyBatisPlus提供的逻辑删除方案。

三、MyBatisPlus提供的逻辑删除

MyBatisPlus官方文档

说明:

只对自动注入的sql起效:

插入: 不作限制
查找: 追加where条件过滤掉已删除数据,且使用 wrapper.entity 生成的where条件会忽略该字段
更新: 追加where条件防止更新到已删除数据,且使用 wrapper.entity 生成的where条件会忽略该字段
删除: 转变为 更新

例如:
删除: update user set deleted=1 where id = 1 and deleted=0
查找: select id,name,deleted from user where deleted=0

字段类型支持说明:

支持所有数据类型(推荐使用 Integer,Boolean,LocalDateTime)
如果数据库字段使用datetime,逻辑未删除值和已删除值支持配置为字符串null,另一个值支持配置为函数来获取值如now()

附录:

逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。
如果你需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示。

使用方法:

步骤1: 配置com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig

例: application.yml

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: flag  # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
步骤2: 实体类字段上加上@TableLogic注解
@TableLogic
private Integer deleted;
步骤3: 使用
@Test
public void apiTest(){
    // UPDATE test.user SET deleted=1 WHERE user_id=? AND deleted=0
    logger.info("开始逻辑删除");
    int count = userDAO.deleteById(356);
    // SELECT * FROM test.user WHERE user_id=? AND deleted=0
    logger.info("开始查询");
    User user = userDAO.selectById(357);
    // UPDATE test.user SET user_name=?, telephone_no=?, id_card_no=?, identity_type=?, sex=?, birth_date=?, marital_status=?, asset_code=?, asset_branch_code=?, issuing_authority=?, job_type=?, address=?, work_unit=?, create_time=? WHERE user_id=? AND deleted=0
    logger.info("开始更新");
    userDAO.updateById(user);
}

MyBatisPlus的逻辑删除功能使用起来非常简单。但是需要我们注意以下几点:

  • 开启逻辑删除功能后,MP在删除、查询和更新时会自动加上条件deleted=0,也就是只对没有删除的数据进行操作;
  • 虽然MP对开启逻辑删除的表的插入操作没什么限制,但是还是建议在建表时,对deleted字段做默认限制,默认为0(未删除),插入数据时这个值可以不用设置;
  • 对于自己在xml文件中定义的接口方法,MP是不会自动对其开启逻辑删除功能的,需要我们自己维护逻辑删除功能; 查找:
  • 追加where条件过滤掉已删除数据,且使用 wrapper.entity 生成的where条件会忽略该字段;

下面是使用 QueryWrapper 进行查询时的sql,我们发现前面的deleted=0条件会让后面我们自己加的deleted条件失效

SELECT * FROM test.user WHERE deleted=0 AND (user_id = ? AND deleted = ? AND user_name = ?)
  • 追加where条件防止更新到已删除数据,且使用 wrapper.entity 生成的where条件会忽略该字段,原因和上面的原因是一样的。

参考

原文链接:https://blog.csdn.net/qq_43695957/article/details/123504418



所属网站分类: 技术文章 > 博客

作者:码神

链接:http://www.javaheidong.com/blog/article/471492/5d0f3326c17fdf366c03/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

13 0
收藏该文
已收藏

评论内容:(最多支持255个字符)