简单的 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(); } }
反馈
您对本页面有什么反馈吗? 我们很乐意听取您的意见!