跳到主要内容

2.2 插入、更新、删除


插入操作

Pojo 插入(推荐)

User user = new User();
user.setName("张三");
user.setAge(25);

DB.Pojo.insert(user); // 自动回填主键到 user 对象
Long id = user.getId();

注意:只有 DB.Pojo.insert() 会自动回填主键。DB.TableDB.Jdbc 等方法不会。

指定表名插入

DB.Table.insert("user")
.value("name", "张三")
.value("age", 25)
.value("create_time", new Date())
.execute();

// 返回自增主键
Long id = DB.Table.insert("user")
.value("name", "张三")
.insertWithAutoKey();

批量插入

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

DB.Batch.insert(users);
DB.Batch.insert(users, 100); // 每批 100 条

插入或更新

User user = new User();
user.setId(1L);
user.setName("张三");

DB.Pojo.insertOrUpdate(user);
// id=1 存在 → UPDATE,不存在 → INSERT

更新操作

Pojo 更新(推荐)

// 根据 ID 更新非空字段
DB.Pojo.updateById(user);

// 更新指定字段
DB.Pojo.update(User.class)
.set(User::getName, "李四")
.set(User::getUpdateTime, new Date())
.eq(User::getId, 1)
.execute();

// 条件更新
DB.Pojo.update(User.class)
.set(User::getStatus, 0)
.lt(User::getLastLoginTime, DateUtil.addDays(new Date(), -30))
.execute();

指定表名更新

DB.Table.update("user")
.set("name", "李四")
.set("update_time", new Date())
.where(Condition.where().eq("id", 1))
.execute();

表达式更新

DB.Table.update("user")
.setSql("score = score + 10")
.setSql("login_count = login_count + 1")
.eq("id", 1)
.execute();

安全机制

无条件更新会被保护:

// 不会更新全表
DB.Pojo.update(User.class).set(User::getStatus, 0).execute();
// → UPDATE user SET status = 0 WHERE is_deleted = 0

删除操作

条件删除

DB.Pojo.delete(User.class).eq(User::getId, 1).execute();

// 复杂条件
DB.Pojo.delete(User.class)
.eq(User::getStatus, 0)
.lt(User::getCreateTime, DateUtil.addDays(new Date(), -365))
.execute();

指定表名删除

DB.Table.delete("user").eq("id", 1).execute();

逻辑删除

当 Bean 中存在 isDeleted 字段时,DLZ-DB 自动将 DELETE 转换为 UPDATE:

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

物理删除

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

DB.Pojo.delete(User.class).eq(User::getId, 1).ignoreLogicDelete(true).execute();
// 执行真正的 DELETE

安全机制

无条件删除会被保护:

DB.Pojo.delete(User.class).execute();
// → DELETE FROM user WHERE is_deleted = 0(不会删全表)