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. 注意事项
-
数据库字段:
- 确保数据库中存在逻辑删除字段(如
is_deleted),并且字段类型与实体类中的类型一致。
- 确保数据库中存在逻辑删除字段(如
-
默认值:
- 插入数据时,逻辑删除字段的默认值应为未删除的值(如
0)。
- 插入数据时,逻辑删除字段的默认值应为未删除的值(如
-
查询已删除数据:
- 如果需要查询已删除的数据,可以使用
ignoreLogicDelete()方法忽略逻辑删除条件。
- 如果需要查询已删除的数据,可以使用
-
全局配置:
- 如果全局配置和
@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 会自动在查询和删除操作中处理逻辑删除逻辑。
- 逻辑删除可以保留数据的历史记录,便于后续查询和恢复。