jOOQ入門
- jOOQ
- JPA
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.數據庫結構
在開始之前,讓我們為示例創建一個簡單的數據庫模式。我們將使用一個簡單的Author
和Article
關係:
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應用程序。