29.5 Using jOOQ

Java面向对象查询(jOOQ)是一个Data Geekery出品的广受欢迎的产品, 它能让你通过其流利的API从从数据库生成Java代码而构建类型安全的SQL查询.商业和开源版本都可以在Spring Boot中使用.

Code Generation

为了使用jOOQ类型安全的查询,你需要从数据库的模式生成Java类.你可以参照jOOQ用户手册. 如果你使用jooq-codegen-maven插件并且您还使用spring-boot-starter-parent父POM,您可以安全地忽略插件的n>标记。versio. 您还可以使用Spring Boot预定义的版本变量(例如h2.version)来声明插件的数据库依赖.下面的清单显示了一个示例:

  1. <plugin>
  2. <groupId>org.jooq</groupId>
  3. <artifactId>jooq-codegen-maven</artifactId>
  4. <executions>
  5. ...
  6. </executions>
  7. <dependencies>
  8. <dependency>
  9. <groupId>com.h2database</groupId>
  10. <artifactId>h2</artifactId>
  11. <version>${h2.version}</version>
  12. </dependency>
  13. </dependencies>
  14. <configuration>
  15. <jdbc>
  16. <driver>org.h2.Driver</driver>
  17. <url>jdbc:h2:~/yourdatabase</url>
  18. </jdbc>
  19. <generator>
  20. ...
  21. </generator>
  22. </configuration>
  23. </plugin>

Using DSLContext

jOOQ提供的简洁的API是通过org.jooq.DSLContext接口初始化的.Spring Boot自动配置DSLContext为Spring Bean实例并且自动连接到你的应用程序数据源. 当然你也可通过@Autowire注入DSLContext,如以下示例所示:

  1. @Component
  2. public class JooqExample implements CommandLineRunner {
  3. private final DSLContext create;
  4. @Autowired
  5. public JooqExample(DSLContext dslContext) {
  6. this.create = dslContext;
  7. }
  8. }

Tip

jOOQ手册倾向于使用一个名为create的变量来保存DSLContext.

然后可以使用DSLContext构造你的查询,如下面的示例所示

  1. public List<GregorianCalendar> authorsBornAfter1980() {
  2. return this.create.selectFrom(AUTHOR)
  3. .where(AUTHOR.DATE_OF_BIRTH.greaterThan(new GregorianCalendar(1980, 0, 1)))
  4. .fetch(AUTHOR.DATE_OF_BIRTH);
  5. }

JOOQ SQL Dialect

除非spring.jooq.sql-dialect属性已经配置,否则Spring Boot为你使用的数据源指定SQL方言.如果Spring Boot不能检测到该方言,则使用DEFAULT.

Note

Spring Boot只能自动配置jOOQ开源版本支持的方言.

customizing jOOQ

当jOOQ Configuration类创建使用时,可通过定义你自己的@Bean来进行高级配置.您可以为以下jOOQ类型定义bean:

  • ConnectionProvider
  • TransactionProvider
  • RecordMapperProvider
  • RecordUnmapperProvider
  • RecordListenerProvider
  • ExecuteListenerProvider
  • VisitListenerProvider

您还可以创建你自己的org.jooq.Configuration @Bean实例,这样你就可以完全管理jOOQ配置.