自动填充 & 逻辑删除

自动填充 & 逻辑删除

一、核心知识点

  • MetaObjectHandler:字段自动填充处理器。
  • @TableField(fill):指定填充时机(INSERT, UPDATE等)。
  • 逻辑删除:UPDATE deleted字段代替物理删除,查询自动过滤。

二、操作步骤

1. 创建自动填充处理器

  • 右键config文件夹,创建MyMetaObjectHandler
    3203083-20260616215547088-1432386419

  • 类中的代码如下所示:

    package com.weitoutiao.config;
    
    import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
    import org.apache.ibatis.reflection.MetaObject;
    import org.springframework.stereotype.Component;
    import java.time.LocalDateTime;
    
    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
        @Override
        public void insertFill(MetaObject metaObject) {
            this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
            this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
        }
        @Override
        public void updateFill(MetaObject metaObject) {
            this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
        }
    }
    

3.News实体中确认已有updateTime字段

4. 测试逻辑删除:

  • testSelect文件的最后继续添加测试类NewsMapperTest,添加的位置和代码代码如下:
    3203083-20260616215618575-1941024269

    @SpringBootTest
    class NewsMapperTest {
        @Autowired
        private NewsMapper newsMapper;
        @Test
        void testDelete() {
            int rows = newsMapper.deleteById(1);
            System.out.println("删除条数:" + rows);
            // 控制台应输出UPDATE news SET deleted=1 WHERE id=1
        }
    }
    

    有红色错误,就鼠标悬停错误位置,选择导入类。

5. 运行测试

  • 逻辑删除前,通过SQLyog查看news表中的数据如下:
    3203083-20260616215643211-631850760
  • 运行测试程序,点击图示中的运行按钮
    3203083-20260616215715991-764139077
  • 控制台输出如下:
    3203083-20260616215824128-1587966827
  • news表中id1的这条数据,其中的deleted变为了1,代表删除成功。
    3203083-20260616215905468-1276330224

四、最终的目录结构

image-20260616083029422

五、逻辑删除的概念

逻辑删除不会在数据库中删除数据,只是通过一个字段用来标识被删除的记录,数据仍然保存在数据库中。

在实际的工作当中,因为数据非常重要,为了防止因用户误操作删除数据后无法恢复的问题,我们通常不会对数据做物理删除,即将数据从数据库中直接删除。而是多采用逻辑删除的方式,即不会真正在删除库删除数据,而是使用一个字段来标识它已经被删除。

如使用 isDeleted 字段标识该条记录是否已经被删除,0代表未删除,1代表已删除。此时对数据库做增删改查的SQL语句会发生如下变化:

• 插入:没有变化;

• 删除:转变为修改操作,即修改字段 isDeleted 为1;

• 修改:需要追加 where 子句,以排除 isDeleted 为1 的数据;

• 查询:需要追加 where 子句,以排除 isDeleted 为1 的数据。

例如:

查询数据:select * from user WHERE isDeleted=0

删除数据:UPDATE user SET isDeleted=1 WHERE id=10 AND isDeleted=0

posted @ 2026-06-26 21:18  沈瑜九  阅读(10)  评论(0)    收藏  举报