3.5 逻辑删除与批量操作
逻辑删除
自动识别
当 Bean 中存在以下字段时,自动启用逻辑删除:
isDeleteddeletedis_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);