跳到主要内容

3.5 逻辑删除与批量操作

逻辑删除

自动识别

当 Bean 中存在以下字段时,自动启用逻辑删除:

  • isDeleted
  • deleted
  • is_deleted(配置指定)

配置

dlz:
db:
logic-delete-field: is_deleted

自动行为

查询自动过滤:

DB.Pojo.select(User.class).eq(User::getStatus, 1).queryBeanList();
// → SELECT * FROM user WHERE status = 1 AND is_deleted = 0

删除变更新:

DB.Pojo.delete(User.class).eq(User::getId, 1).execute();
// → UPDATE user SET is_deleted = 1 WHERE id = 1 AND is_deleted = 0

更新自动过滤:

DB.Pojo.updateById(user);
// → UPDATE user SET ... WHERE id = 1 AND is_deleted = 0

查询已删除数据

逻辑删除开启后查询自动带 is_deleted = 0 条件。如需查询已被逻辑删除的数据,可以使用 ignoreLogicDelete(true)

List<User> deletedUsers = DB.Pojo.select(User.class)
.ignoreLogicDelete(true)
.eq(User::getStatus, 1)
.queryBeanList();
// → SELECT * FROM user WHERE status = 1 (无 is_deleted = 0 过滤)

物理删除

如需执行真正的 DELETE(绕过逻辑删除),可以使用 Table 方式:

DB.Pojo.delete(User.class).ignoreLogicDelete(true).eq(User::getId, 1).execute();
// → DELETE FROM user WHERE id = 1

批量操作

批量插入

List<User> users = Arrays.asList(
new User("张三", 25),
new User("李四", 30)
);

// 方式1:使用 DB.Batch
DB.Batch.insert(users);

// 方式2:使用 Pojo 批量
DB.Pojo.insert(users.get(0)); // 单个插入
// 注意:Pojo 没有批量插入方法,请使用 DB.Batch

条件批量更新

DB.Pojo.update(User.class)
.set(User::getStatus, 0)
.in(User::getId, Arrays.asList(1, 2, 3, 4, 5))
.execute();

批量删除

DB.Pojo.delete(User.class)
.in(User::getId, Arrays.asList(1, 2, 3, 4, 5))
.execute();

性能建议

// ❌ 避免循环单条
for (User user : users) {
DB.Pojo.insert(user);
}

// ✅ 使用批量操作
DB.Batch.insert(users);