mybatis-plus @TableLogic 逻辑删除

3,143 阅读3分钟

MyBatis-Plus 提供了 @TableLogic 注解,用于实现 逻辑删除 功能。逻辑删除是指在数据库中并不真正删除数据,而是通过更新某个字段的值来标记数据已被删除。这种方式可以保留数据的历史记录,便于后续查询和恢复。


1.  @TableLogic 的作用

  • 逻辑删除字段
    • 通常使用一个字段(如 is_deleted)来标记数据是否被删除。
    • 例如:is_deleted = 0 表示未删除,is_deleted = 1 表示已删除。
  • 自动处理查询和删除
    • 使用 @TableLogic 注解后,MyBatis-Plus 会自动在查询和删除操作中加上逻辑删除的条件。

2. 使用步骤

步骤 1:在实体类中标记逻辑删除字段

在实体类中,使用 @TableLogic 注解标记逻辑删除字段。

import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

@Data
@TableName("user") // 指定表名
public class User {

    @TableId // 主键字段
    private Long id;

    private String name;

    @TableLogic // 逻辑删除字段
    private Integer isDeleted;
}

步骤 2:配置逻辑删除的值

在 application.yml 或 application.properties 中配置逻辑删除的值。

  • application.yml
mybatis-plus:
  global-config:
    db-config:
      logic-delete-value: 1 # 已删除的值
      logic-not-delete-value: 0 # 未删除的值
  • application.properties
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

步骤 3:使用 MyBatis-Plus 的 CRUD 方法

MyBatis-Plus 会自动处理逻辑删除的逻辑。

  • 插入数据
User user = new User();
user.setName("John");
userMapper.insert(user); // isDeleted 默认为 0(未删除)
  • 查询数据
List<User> userList = userMapper.selectList(null);
生成的 SQL
SELECT * FROM user WHERE is_deleted = 0;
  • 删除数据
    删除要用 getBaseMapper().delete
userMapper.deleteById(1L);
生成的 SQL
UPDATE user SET is_deleted = 1 WHERE id = 1;
  • 查询已删除的数据
    如果需要查询已删除的数据,可以使用自定义 SQL 或忽略逻辑删除条件:
userMapper.selectList(new QueryWrapper<User>().ignoreLogicDelete());

3. 自定义逻辑删除字段和值

如果数据库中的逻辑删除字段或值与默认配置不同,可以通过 @TableLogic 注解的属性进行自定义。

示例:

@TableLogic(value = "0", delval = "1") // value 表示未删除的值,delval 表示已删除的值
private Integer status;

配置:

  • application.yml
mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: status # 逻辑删除字段名
      logic-delete-value: 1 # 已删除的值
      logic-not-delete-value: 0 # 未删除的值

4. 注意事项

  1. 数据库字段

    • 确保数据库中存在逻辑删除字段(如 is_deleted),并且字段类型与实体类中的类型一致。
  2. 默认值

    • 插入数据时,逻辑删除字段的默认值应为未删除的值(如 0)。
  3. 查询已删除数据

    • 如果需要查询已删除的数据,可以使用 ignoreLogicDelete() 方法忽略逻辑删除条件。
  4. 全局配置

    • 如果全局配置和 @TableLogic 注解的属性冲突,以注解属性为准。

5. 示例代码

实体类:

@Data
@TableName("user")
public class User {

    @TableId
    private Long id;

    private String name;

    @TableLogic(value = "0", delval = "1") // 逻辑删除字段
    private Integer isDeleted;
}

配置文件:

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: isDeleted # 逻辑删除字段名
      logic-delete-value: 1 # 已删除的值
      logic-not-delete-value: 0 # 未删除的值

测试代码:

@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testLogicDelete() {
        // 插入数据
        User user = new User();
        user.setName("John");
        userMapper.insert(user);

        // 查询数据(未删除)
        List<User> userList = userMapper.selectList(null);
        System.out.println("未删除的数据:" + userList);

        // 删除数据
        userMapper.deleteById(user.getId());

        // 查询数据(已删除)
        userList = userMapper.selectList(null);
        System.out.println("删除后的数据:" + userList);
    }
}

6. 总结

  • @TableLogic 是 MyBatis-Plus 提供的逻辑删除注解,用于标记逻辑删除字段。
  • 通过配置 logic-delete-value 和 logic-not-delete-value,可以自定义逻辑删除的值。
  • MyBatis-Plus 会自动在查询和删除操作中处理逻辑删除逻辑。
  • 逻辑删除可以保留数据的历史记录,便于后续查询和恢复。