可用版本: 开发版 (3.21) | 最新版 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

简单的 CRUD 操作

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

如果您使用 jOOQ 的 代码生成器,它会为具有主键的每个表生成 org.jooq.UpdatableRecord 实现。当 从数据库获取 这样的记录时,这些记录会“附加”到创建它们的 Configuration。这意味着它们会持有对用于获取它们的数据库连接的内部引用。以下 UpdatableRecord 方法将内部使用此连接:

// Refresh a record from the database.
void refresh() throws DataAccessException;

// Store (insert or update) a record to the database.
int store() throws DataAccessException;

// Delete a record from the database
int delete() throws DataAccessException;

有关“附加”对象的更多信息,请参阅手册中关于 序列化 的章节。

存储

存储记录将执行 INSERT 语句UPDATE 语句。通常,新记录总是会被插入,而从数据库加载的记录则总是被更新。这在代码中体现得最好:

// Create a new record
BookRecord book1 = create.newRecord(BOOK);

// Insert the record: INSERT INTO BOOK (TITLE) VALUES ('1984');
book1.setTitle("1984");
book1.store();

// Update the record: UPDATE BOOK SET PUBLISHED_IN = 1984 WHERE ID = [id]
book1.setPublishedIn(1948);
book1.store();

// Get the (possibly) auto-generated ID from the record
Integer id = book1.getId();

// Get another instance of the same book
BookRecord book2 = create.fetchOne(BOOK, BOOK.ID.eq(id));

// Update the record: UPDATE BOOK SET TITLE = 'Animal Farm' WHERE ID = [id]
book2.setTitle("Animal Farm");
book2.store();

关于存储的一些说明

  • jOOQ 在 INSERT 语句UPDATE 语句 中仅设置已修改的值。这允许将默认值应用于插入的记录,如 CREATE TABLE DDL 语句中所指定的那样。
  • 当 store() 执行 INSERT 语句 时,jOOQ 会尝试将任何生成的键从数据库加载回记录。有关更多详细信息,请参阅手册中关于 IDENTITY 值 的章节。
  • 除了加载 identity 值之外,store() 还可以配置为刷新整个记录。有关详细信息,请参阅 returnAllOnUpdatableRecord 设置
  • 当从 POJOs 加载记录时,jOOQ 会假定该记录是新记录。因此,它将尝试插入它。
  • 当您激活 乐观锁定 时,如果底层数据库记录已被更改,存储记录可能会失败。

删除

删除记录将从数据库中将其移除。以下是删除记录的方法:

// Get a previously inserted book
BookRecord book = create.fetchOne(BOOK, BOOK.ID.eq(5));

// Delete the book
book.delete();

刷新

从数据库刷新记录意味着 jOOQ 将发出 SELECT 语句 来刷新除主键以外的所有记录值。当您使用 jOOQ 的 乐观锁定 功能时,如果修改过的记录“陈旧”且无法存储到数据库(因为底层数据库记录在此期间已更改),这一点尤其有用。

要执行刷新,请使用以下 Java 代码:

// Fetch an updatable record from the database
BookRecord book = create.fetchOne(BOOK, BOOK.ID.eq(5));

// Refresh the record
book.refresh();

CRUD 和 SELECT 语句

CRUD 操作可以与常规查询结合使用,如果您从单个数据库表中选择记录,如手册中关于 SELECT 语句 的章节中所述。为此,您需要使用 DSLContext 中的 selectFrom() 方法。

// Loop over records returned from a SELECT statement
for (BookRecord book : create.fetch(BOOK, BOOK.PUBLISHED_IN.eq(1948))) {

  // Perform actions on BookRecords depending on some conditions
  if ("Orwell".equals(book.fetchParent(Keys.FK_BOOK_AUTHOR).getLastName())) {
    book.delete();
  }
}

反馈

您对本页面有什么反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo