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