jOOQ入門

1.簡介

在本教程中,我們將快速瀏覽如何使用jOOQ (Java面向對象的查詢)運行應用程序。該庫基於數據庫表生成Java類,並允許我們通過其流暢的API創建類型安全的SQL查詢。

我們將介紹整個設置,PostgreSQL數據庫連接以及一些CRUD操作示例。

2.Maven依賴

對於jOOQ庫,我們需要以下三個jOOQ依賴項

<dependency>

 <groupId>org.jooq</groupId>

 <artifactId>jooq</artifactId>

 <version>3.13.4</version>

 </dependency>

 <dependency>

 <groupId>org.jooq</groupId>

 <artifactId>jooq-meta</artifactId>

 <version>3.13.4</version>

 </dependency>

 <dependency>

 <groupId>org.jooq</groupId>

 <artifactId>jooq-codegen</artifactId>

 <version>3.13.4</version>

 </dependency>

我們還需要一個PostgreSQL驅動程序依賴項:

<dependency>

 <groupId>org.postgresql</groupId>

 <artifactId>postgresql</artifactId>

 <version>42.2.16</version>

 </dependency>

3.數據庫結構

在開始之前,讓我們為示例創建一個簡單的數據庫模式。我們將使用一個簡單的AuthorArticle關係:

create table AUTHOR

 (

 ID integer PRIMARY KEY,

 FIRST_NAME varchar(255),

 LAST_NAME varchar(255),

 AGE integer

 );



 create table ARTICLE

 (

 ID integer PRIMARY KEY,

 TITLE varchar(255) not null,

 DESCRIPTION varchar(255),

 AUTHOR_ID integer

 CONSTRAINT fk_author_id REFERENCES AUTHOR

 );

4.數據庫連接

現在,讓我們看一下如何連接到數據庫。

首先,我們需要提供數據庫的用戶名,密碼和完整URL。我們將使用以下屬性,通過使用DriverManager及其getConnection方法Connection

String userName = "user";

 String password = "pass";

 String url = "jdbc:postgresql://db_host:5432/baeldung";

 Connection conn = DriverManager.getConnection(url, userName, password);

接下來,我們需要創建DSLContext的實例。該對象將成為jOOQ接口的入口點:

DSLContext context = DSL.using(conn, SQLDialect.POSTGRES);

在我們的案例中,我們傳遞的是POSTGRES方言,但是其他可用的方言很少,例如H2,MySQL,SQLite等。

5.代碼生成

要為我們的數據庫表生成Java類,我們需要以下jooq-config.xml文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

 <configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-3.13.0.xsd">



 <jdbc>

 <driver>org.postgresql.Driver</driver>

 <url>jdbc:postgresql://db_url:5432/baeldung_database</url>

 <user>username</user>

 <password>password</password>

 </jdbc>



 <generator>

 <name>org.jooq.codegen.JavaGenerator</name>



 <database>

 <name>org.jooq.meta.postgres.PostgresDatabase</name>

 <inputSchema>public</inputSchema>

 <includes>.*</includes>

 <excludes></excludes>

 </database>



 <target>

 <packageName>com.baeldung.jooq.model</packageName>

 <directory>C:/projects/baeldung/tutorials/jooq-examples/src/main/java</directory>

 </target>

 </generator>

 </configuration>

自定義配置需要在<jdbc>部分(用於放置數據庫憑據)和<target>部分(用於為要生成的類配置程序包名稱和位置目錄)中進行更改。

要執行jOOQ代碼生成工具,我們需要運行以下代碼:

GenerationTool.generate(

 Files.readString(

 Path.of("jooq-config.xml")

 )

 );

生成完成後,我們將獲得以下兩個類,每個類對應於其數據庫表:

com.baeldung.model.generated.tables.Article;

 com.baeldung.model.generated.tables.Author;

6.CRUD操作

現在,讓我們看一下可以使用jOOQ庫執行的一些基本CRUD操作。

6.1 創建記錄

首先,讓我們創建一個新的Article記錄。為此,我們需要使用適當的表引用作為參數newRecord

ArticleRecord article = context.newRecord(Article.ARTICLE);

Article.ARTICLE ARTICLE數據庫表的引用實例。它是由jOOQ在代碼生成過程中自動創建的。

接下來,我們可以為所有需要的屬性設置值:

article.setId(2);

 article.setTitle("jOOQ examples");

 article.setDescription("A few examples of jOOQ CRUD operations");

 article.setAuthorId(1);

最後,我們需要store方法以將其保存在數據庫中:

article.store();

6.2 讀取值

現在,讓我們看看如何從數據庫中讀取值。例如,讓我們選擇所有作者:

Result<Record> authors = context.select()

 .from(Author.AUTHOR)

 .fetch();

在這裡,我們將select方法與from子句結合使用,以指示要從哪個表讀取。調用fetch方法將執行SQL查詢並返回生成的結果。

Result對象實現了Iterable接口,因此很容易在每個元素上進行迭代。在訪問單個記錄的同時,我們可以通過使用帶有適當字段引用getValue

authors.forEach(author -> {

 Integer id = author.getValue(Author.AUTHOR.ID);

 String firstName = author.getValue(Author.AUTHOR.FIRST_NAME);

 String lastName = author.getValue(Author.AUTHOR.LAST_NAME);

 Integer age = author.getValue(Author.AUTHOR.AGE);



 System.out.printf("Author %s %s has id: %d and age: %d%n", firstName, lastName, id, age);

 });

我們可以將選擇查詢限制為一組特定字段。讓我們只獲取文章ID和標題:

Result<Record2<Integer, String>> articles = context.select(Article.ARTICLE.ID, Article.ARTICLE.TITLE)

 .from(Author.AUTHOR)

 .fetch();

我們還可以使用fetchOne方法選擇單個對象。這一項的參數是表引用和匹配正確記錄的條件。

在我們的例子中,讓我們選擇一個ID等於1 Author

AuthorRecord author = context.fetchOne(Author.AUTHOR, Author.AUTHOR.ID.eq(1))

如果沒有記錄符合條件,則fetchOne方法將返回null

6.3 更新中

要更新給定的記錄,我們可以將DSLContext update方法與需要更改的每個字段set方法調用結合使用。此語句後應帶有適當匹配條件where

context.update(Author.AUTHOR)

 .set(Author.AUTHOR.FIRST_NAME, "David")

 .set(Author.AUTHOR.LAST_NAME, "Brown")

 .where(Author.AUTHOR.ID.eq(1))

 .execute();

execute方法之後,更新查詢才會運行。作為返回值,我們將獲得一個等於已更新記錄數的整數。

store方法來更新已獲取的記錄:

ArticleRecord article = context.fetchOne(Article.ARTICLE, Article.ARTICLE.ID.eq(1));

 article.setTitle("A New Article Title");

 article.store();

如果操作成功,則store方法將返回1如果不需要更新, 0例如,條件沒有匹配任何內容。

6.4 刪除中

要刪除給定的記錄,我們可以使用DSLContext對DSLContext delete方法。刪除條件應在以下where子句中作為參數傳遞:

context.delete(Article.ARTICLE)

 .where(Article.ARTICLE.ID.eq(1))

 .execute();

execute方法之後,刪除查詢才會運行。作為返回值,我們將獲得一個等於已刪除記錄數的整數。

還可以通過執行已刪除的記錄的delete方法來刪除它:

ArticleRecord articleRecord = context.fetchOne(Article.ARTICLE, Article.ARTICLE.ID.eq(1));

 articleRecord.delete();

如果操作成功,則delete方法將返回1如果不需要delete 0例如,當條件不符合條件時。

7.結論

在本文中,我們學習瞭如何使用jOOQ框架配置和創建簡單的CRUD應用程序。