jOOQ最初是作为一个库完全是JDBC和所有的数据库交互的抽象层而被创建。 在已有的软件产品中经常遇到的各种最佳实践被应用到这个库中。包含如下:
实际上,jOOQ最初设计的目的是取代除处理连接池之外的任何其他数据库抽象框架。
以你喜欢的方式使用jOOQ
…但是开源是社区驱动的。 社区已经展示了各种不同于最初意图的使用jOOQ的方法。遇到的一些用例是:
下面部分解释了在你的应用中,使用jOOQ的各种各样的案例。
我们强烈推荐使用jOOQ并使用其代码生成器来充分列用jOOQ的特性!
然后, 如果你拥有一个动态的模式, 则不必使用代码生成器。 这是所有的使用场景中最简单的方式, 允许为任何数据库构建有效的SQL。在这种应用场景中, 你将不必使用jOOQ的代码生成器,甚至可能都没有jOOQ的查询执行工具。相反,您将使用jOOQ的查询DSL API将字符串、文字和其他用户定义的对象包装到一个面向对象的、类型安全的AST中,对SQL语句进行建模。如下给出一个案例:
// Fetch a SQL string from a jOOQ Query in order to manually execute it with another tool.
// For simplicity reasons, we're using the API to construct case-insensitive object references, here.
Query query = create.select(field("BOOK.TITLE"), field("AUTHOR.FIRST_NAME"), field("AUTHOR.LAST_NAME"))
.from(table("BOOK"))
.join(table("AUTHOR"))
.on(field("BOOK.AUTHOR_ID").eq(field("AUTHOR.ID")))
.where(field("BOOK.PUBLISHED_IN").eq(1948));
String sql = query.getSQL();
List<Object> bindValues = query.getBindValues();
使用jOOQ查询DSL构建的SQL可以直接被JDBC所执行, 使用Spring的JdbcTemplate, 使用Apache DbUtils和很多其他工具(注意, 自从jOOQ缺省使用 java.sql.PreparedStatement, 对于“1987”,将会生成一个绑定变量, 可以阅读绑定变量部分)
你也可以避免单独获取SQL字符串和绑定变量:
String sql = query.getSQL(ParamType.INLINED);
如果您希望仅将jOOQ用作SQL构建器,那么手册的以下部分可能会引起您的兴趣:
除过上述章节中使用独立的SQL构建器, 您还可以使用jOOQ的代码生成特性,以便使用Java编译器针对实际的数据库模式编译SQL语句。这为仅仅使用DSL查询和自定义字符串和文字构造SQL增加了很多功能和表现力,因为您可以确保所有数据库工件实际上存在于数据库中,并且它们的类型是正确的。我们强烈建议使用这种方法。 如下给出了一个例子:
// Fetch a SQL string from a jOOQ Query in order to manually execute it with another tool.
Query query = create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
.from(BOOK)
.join(AUTHOR)
.on(BOOK.AUTHOR_ID.eq(AUTHOR.ID))
.where(BOOK.PUBLISHED_IN.eq(1948));
String sql = query.getSQL();
List<Object> bindValues = query.getBindValues();
使用jOOQ查询DSL构建的SQL可以直接被JDBC所执行, 使用Spring的JdbcTemplate, 使用Apache DbUtils和很多其他工具(注意, 自从jOOQ缺省使用 java.sql.PreparedStatement, 对于“1987”,将会生成一个绑定变量, 可以阅读绑定变量部分)
你也可以避免单独获取SQL字符串和绑定变量:
String sql = query.getSQL(ParamType.INLINED);
如果您希望仅将jOOQ用作SQL构建器,那么手册的以下部分可能会引起您的兴趣:
除过前面提到的任何工具, 你也可以直接使用jOOQ来执行jOOQ生成的SQL语句。这将在前面讨论用于SQL类型安全构建的的API的基础上增加许多便利,此时可以重用来自自动生成的类,获取记录和自定义数据类型。如下给出一个案例:
// Typesafely execute the SQL statement directly with jOOQ
Result<Record3<String, String, String>> result =
create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
.from(BOOK)
.join(AUTHOR)
.on(BOOK.AUTHOR_ID.eq(AUTHOR.ID))
.where(BOOK.PUBLISHED_IN.eq(1948))
.fetch();
通过让jOOQ执行SQL, jOOQ查询DSL变成了真正的嵌入式SQL。
不过,jOOQ并不止于此! 您可以使用jOOQ执行任何SQL。换句话说,您可以使用任何其他SQL构建工具并使用jOOQ运行SQL语句。下面是一个例子:
// 使用你喜爱的工具构建sql字符串。
String sql = "SELECT title, first_name, last_name FROM book JOIN author ON book.author_id = author.id " +
"WHERE book.published_in = 1984";
// 使用jOOQ获取数据
Result<Record> result = create.fetch(sql);
// 或者使用JDBC获取数据。
ResultSet rs = connection.createStatement().executeQuery(sql);
Result<Record> result = create.fetch(rs);
果您希望使用jOOQ作为SQL执行器(或不使用)代码生成,手册的以下部分将对您感兴趣:
除了jOOQ流畅的API用于查询构造之外,jOOQ还可以帮助您执行日常的CRUD操作。下面是一个例子:
// Fetch an author
AuthorRecord author = create.fetchOne(AUTHOR, AUTHOR.ID.eq(1));
// Create a new author, if it doesn't exist yet
if (author == null) {
author = create.newRecord(AUTHOR);
author.setId(1);
author.setFirstName("Dan");
author.setLastName("Brown");
}
// Mark the author as a "distinguished" author and store it
author.setDistinguished(1);
// Executes an update on existing authors, or insert on new ones
author.store();
如果您希望使用jOOQ的所有特性,那么您可能会对手册的以下部分感兴趣(包括所有分段):
jOOQ不仅仅是一个可以帮助您构建和执行SQL的工具以应对你产生的,兼容的模式。jOOQ附带了很多工具。以下是jOOQ附带了很多工具。 这里列举jOOQ附带的非常重要的工具:
如果你是一个你喜爱的功能丰富的数据库的高级用户, jOOQ将帮助您访问数据库供应商的所有特定SQL特性,例如OLAP特性, 存储过程, 用户自定义类型,制造商特定SQL, 函数, 以及更多。 本指南中包含了这些例程。
如下为jOOQ的学习大纲的思维导图:https://www.drawon.cn/template/details/656ac5efc083fb5228fc17f8