拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO

jOOQ入门

白鹭 - 2021-11-24 836 0 0

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应用程序。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *