jOOQ 是基于 JDBC 之上的一个抽象层,提供了多种多样的模型来与关系型数据库进行互操作;其使用与 mybatisHibernate ORM 不同的思路来实现 对象关系映射 ORM

JOOQ 的使用 - 代码生成配置 (PostgreSQL & DDL Driven) 介绍了使用 jOOQ 为数据库表生成实体类代码;JOOQ 的使用 - 执行 SQL 语句 (SQL Executor) 介绍了基于 jOOQ 的 SQL 命令执行;作为对比,本篇主要介绍基于生成代码的 SQL 命令执行 (SQL Executor) 。

🔗Generated Classes

本文使用了 代码生成 里面的基于 PostgreSQL 实例驱动生成的代码,代码结构如下:

├── tables
│   ├── daos
│   │   ├── AuthorDao.java
│   │   └── BookDao.java
│   ├── interfaces
│   │   ├── IAuthor.java
│   │   └── IBook.java
│   ├── pojos
│   │   ├── Author.java
│   │   └── Book.java
│   ├── records
│   │   ├── AuthorRecord.java
│   │   └── BookRecord.java
│   ├── Author.java
│   └── Book.java
├── DefaultCatalog.java
├── Indexes.java
├── Keys.java
├── Public.java
├── Sequences.java
└── Tables.java

🔗SQL Building

🔗Common

公共代码:

private DSLContext dsl;

@BeforeEach
void setUp(@TempDir final Path dir) throws Exception {
    dsl = DSL.using(SQLDialect.POSTGRES);
}

🔗select

final Result<Record4<Long, String, String, String>> fetched =
    dsl.select(Tables.AUTHOR.ID, Tables.AUTHOR.FIRST_NAME,
            Tables.AUTHOR.LAST_NAME, Tables.BOOK.TITLE)
        .from(Tables.AUTHOR.as("u"))
        .join(Tables.BOOK.as("b"))
        .on(Tables.AUTHOR.ID.eq(Tables.BOOK.AUTHOR_ID))
        .where(Tables.AUTHOR.FIRST_NAME.eq("Elvis"))
        .and(Tables.AUTHOR.LAST_NAME.eq("Wang"))
        .fetch();

fetched.forEach(
    r -> System.out.println(
        String.format("Author ID: %d, name %s %s, book title %s",
        r.value1(), r.value2(), r.value3(), r.value4())
    )
);

🔗insert

final Optional<AuthorRecord> inserted = dsl.insertInto(Tables.AUTHOR)
    .columns(Tables.AUTHOR.FIRST_NAME, Tables.AUTHOR.LAST_NAME)
    .values("Elvis", "Wang")
    .returning(Tables.AUTHOR.ID)
    .fetchOptional();

inserted.ifPresent(r -> System.out.println(r.getId()));

🔗update

final int n = dsl.update(Tables.AUTHOR)
    .set(Tables.AUTHOR.FIRST_NAME, "Elvis")
    .set(Tables.AUTHOR.LAST_NAME, "Wang")
    .where(Tables.AUTHOR.ID.eq(1993L))
    .execute();

System.out.println("Update " + n + " records");

🔗delete

final int n = dsl
    .delete(Tables.AUTHOR)
    .where(Tables.AUTHOR.ID.eq(1993L))
    .execute();

System.out.println("Delete " + n + " records");

完整的示例代码可以参见 jOOQ Usecases

想了解更多的 jOOQ 用法,可以阅读 官方文档


可以明显感觉到,使用 jOOQ 生成的代码为 SQL 执行提供了更强的类型安全保证。

以上。