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
)来声明插件的数据库依赖.下面的清单显示了一个示例:
<plugin>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<executions>
...
</executions>
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>${h2.version}</version>
</dependency>
</dependencies>
<configuration>
<jdbc>
<driver>org.h2.Driver</driver>
<url>jdbc:h2:~/yourdatabase</url>
</jdbc>
<generator>
...
</generator>
</configuration>
</plugin>
Using DSLContext
jOOQ提供的简洁的API是通过org.jooq.DSLContext
接口初始化的.Spring Boot自动配置DSLContext为Spring Bean实例并且自动连接到你的应用程序数据源.
当然你也可通过@Autowire
注入DSLContext
,如以下示例所示:
@Component
public class JooqExample implements CommandLineRunner {
private final DSLContext create;
@Autowired
public JooqExample(DSLContext dslContext) {
this.create = dslContext;
}
}
Tip
jOOQ手册倾向于使用一个名为
create
的变量来保存DSLContext
.
然后可以使用DSLContext构造你的查询,如下面的示例所示
public List<GregorianCalendar> authorsBornAfter1980() {
return this.create.selectFrom(AUTHOR)
.where(AUTHOR.DATE_OF_BIRTH.greaterThan(new GregorianCalendar(1980, 0, 1)))
.fetch(AUTHOR.DATE_OF_BIRTH);
}
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配置.