逻辑删除

项目开发   2024-06-14 09:52   870   0  

字段定义及注解

@TableLogic(value = "0", delval = "unix_timestamp()")
@TableField(select = false)@Schema(description = "是否删除", title = "是否删除:0=未删除 非0=删除")
private Long isDeleted;

@TableLogic 注解

  • 作用:这个注解通常用于逻辑删除字段,配合 MyBatis-Plus 框架使用。

  • 参数:

    • value = "0":表示未删除的值,在逻辑上表示记录未被删除。

    • delval = "unix_timestamp()":表示删除时的值,这里使用了 unix_timestamp() 函数,将删除时间记录为 Unix 时间戳。

使用 @TableLogic 注解,MyBatis-Plus 在执行删除操作时,不会物理删除记录,而是更新 isDeleted 字段为指定的删除值(这里是 Unix 时间戳)。

@TableField 注解

  • 作用:控制字段在数据库操作中的行为,主要用于 MyBatis-Plus 框架。

  • 参数:

    • select = false:表示在查询时该字段默认不会被选中。这有助于提高查询性能,避免不必要的数据传输。

@Schema 注解

  • 作用:通常用于 OpenAPI/Swagger 注解,用来生成 API 文档。

  • 参数:

    • description = "是否删除":提供字段的描述信息。

    • title = "是否删除:0=未删除 非0=删除":提供字段的标题信息,详细说明字段的意义和可能的值。

使用场景

上述注解配置的 isDeleted 字段可能会用于以下场景:

  1. 逻辑删除:通过 @TableLogic 注解实现逻辑删除操作,避免物理删除记录,从而保留历史数据。

  2. 查询优化:通过 @TableField(select = false) 注解在默认情况下不选择该字段,优化查询性能。

  3. API 文档生成:通过 @Schema 注解生成更清晰的 API 文档,帮助开发者理解字段的用途。

示例:如何在代码中使用这些注解

假设你有一个实体类 User,其中包含上述字段定义:

public class User {    
   @TableLogic(value = "0", delval = "unix_timestamp()")
   @TableField(select = false)
   @Schema(description = "是否删除", title = "是否删除:0=未删除 非0=删除")
   private Long isDeleted;    
   // 其他字段和方法}

MyBatis-Plus 配置和查询示例

配置 MyBatis-Plus 时,无需额外配置,框架会自动识别 @TableLogic 注解,并在执行删除操作时自动处理逻辑删除。

public void deleteUser(Long userId) {
  userMapper.deleteById(userId);    // 这将执行逻辑删除操作,即更新 isDeleted 字段为 Unix 时间戳
}
public List<User> getAllUsers() {    
    return userMapper.selectList(null);    // 默认情况下,查询结果不包含 isDeleted 字段
}

通过这种方式,可以方便地管理逻辑删除记录,并生成清晰的 API 文档。

逻辑删除的具体实现步骤

  1. 注解解析:

  • MyBatis-Plus 在启动时会解析实体类中的@TableLogic注解,确定哪个字段用于逻辑删除。

SQL自动拼接:

  • 在执行查询、更新和删除操作时,MyBatis-Plus 会根据逻辑删除配置自动拼接 SQL 语句。

拦截器:

  • MyBatis-Plus 通过拦截器机制对 SQL 进行拦截和修改,增加逻辑删除相关的条件。

代码生成:

  • 当生成 CRUD 方法时,MyBatis-Plus 会根据逻辑删除配置生成相应的 SQL 语句。


博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。