如果你想使用时间字段作为逻辑删除的标志,那么你可以这样做:
- 在数据库表中添加一个名为deleted_at的字段,类型为datetime或timestamp,用来存储数据被删除的时间。
- 在实体类中添加一个名为deletedAt的属性,类型为LocalDateTime或Date,用来映射数据库中的deleted_at字段,并添加@TableLogic注解。
- 在配置文件中指定逻辑删除的值,比如逻辑未删除值为null,逻辑删除值为当前时间。
- 这样,当你调用deleteById或deleteBatchIds等方法时,就会自动更新deleted_at字段为当前时间,而不是真正删除数据。当你调用selectById或selectList等方法时,就会自动过滤掉deleted_at不为null的数据,只查询未被删除的数据。
下面是一个使用mybatis-plus实现逻辑删除的代码示例:
// 数据库表
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`username` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
`password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
`age` int(10) NULL DEFAULT NULL COMMENT '年龄',
`deleted_at` datetime NULL DEFAULT NULL COMMENT '逻辑删除时间',
PRIMARY KEY (`id`) USING BTREE
)
// 实体类
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String username;
private String password;
private Integer age;
@TableLogic
@TableField(fill = FieldFill.INSERT)
private LocalDateTime deletedAt;
}
// 配置文件
mybatis-plus:
global-config:
db-config:
logic-delete-value: now() # 逻辑已删除值
logic-not-delete-value: null # 逻辑未删除值
// 测试类
@SpringBootTest
class UserTest {
@Autowired
private UserMapper userMapper;
// 测试插入数据
@Test
void testInsert() {
User user = new User();
user.setUsername("Tom");
user.setPassword("123456");
user.setAge(18);
userMapper.insert(user);
System.out.println(user);
}
// 测试查询数据
@Test
void testSelect() {
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
}
// 测试逻辑删除数据
@Test
void testDelete() {
int rows = userMapper.deleteById(1L);
System.out.println("影响行数:" + rows);
}
}