1. 概述
本教程是《使用Spring与jOOQ入门》文章的后续内容,主要讲解在Spring Boot应用中使用jOOQ的方法。
如果你还没有阅读过那篇文章,请先浏览一下,并按照第2节的Maven依赖和第3节的代码生成部分进行操作。这将为你生成代表样例数据库表的Java类源代码,包括Author
、Book
和AuthorBook
。
2. Maven配置
除了上一教程中的依赖和插件之外,为了使jOOQ与Spring Boot协同工作,还需要在Maven pom.xml文件中添加其他组件。
2.1. 依赖管理
最常用的使用Spring Boot的方式是从spring-boot-starter-parent
项目继承,通过parent
元素声明。然而,这种方法并不总是适用,因为它会引入一个需要遵循的继承链,而在很多情况下,用户可能并不希望这样。
本教程采用另一种方法:将依赖管理委托给Spring Boot。要做到这一点,只需在pom.xml文件中添加以下dependencyManagement
元素:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.2.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.2. 依赖
为了让Spring Boot控制jOOQ,需要声明对spring-boot-starter-jooq
artefact的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jooq</artifactId>
<version>3.2.2</version>
</dependency>
请注意,本文专注于jOOQ的开源版本。如果你想使用商业发行版,可以查看官方博客上的如何在Spring Boot中使用jOOQ的商业发行版。
3. Spring Boot配置
3.1. 初始启动配置
在深入到jOOQ支持之前,我们先从Spring Boot的基础配置开始。
首先,我们将利用Boot的持久化支持和改进,在标准的application.properties
文件中包含我们的数据访问信息。这样,我们就可以跳过定义bean,并通过单独的属性文件进行配置。
在这里,我们将添加URL和凭据来定义嵌入式H2数据库:
spring.datasource.url=jdbc:h2:~/jooq
spring.datasource.username=sa
spring.datasource.password=
我们还将定义一个简单的Boot应用:
@SpringBootApplication
@EnableTransactionManagement
public class Application {
}
这个应用我们将保持简单,只会在另一个配置类——InitialConfiguration
中定义所有其他bean声明。
3.2. Bean配置
现在让我们定义这个InitialConfiguration
类:
@Configuration
public class InitialConfiguration {
// Other declarations
}
Spring Boot已经自动根据application.properties
文件中的设置生成并配置了dataSource
bean,因此我们不需要手动注册它。以下代码展示了如何让自动配置的DataSource
bean注入到字段中,以及如何使用这个bean:
@Autowired
private DataSource dataSource;
@Bean
public DataSourceConnectionProvider connectionProvider() {
return new DataSourceConnectionProvider
(new TransactionAwareDataSourceProxy(dataSource));
}
由于Spring Boot已经自动创建并配置了名为transactionManager
的bean,因此我们不需要像上一教程那样声明DataSourceTransactionManager
类型的其他bean以利用Spring事务支持。
同样地,我们以与前一教程中的PersistenceContext
类相同的方式创建DSLContext
bean:
@Bean
public DefaultDSLContext dsl() {
return new DefaultDSLContext(configuration());
}
最后,需要提供一个Configuration
实现给DSLContext
。由于Spring Boot能够通过类路径上存在的H2 artefact识别使用的SQL方言,所以不再需要dialect配置:
public DefaultConfiguration configuration() {
DefaultConfiguration jooqConfiguration = new DefaultConfiguration();
jooqConfiguration.set(connectionProvider());
jooqConfiguration
.set(new DefaultExecuteListenerProvider(exceptionTransformer()));
return jooqConfiguration;
}
4. 使用Spring Boot与jOOQ
为了简化本教程中Spring Boot支持jOOQ的演示,我们重用了上一教程中的测试案例,稍作修改其类级别的注解:
@SpringApplicationConfiguration(Application.class)
@Transactional("transactionManager")
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringBootTest {
// Other declarations
}
很明显,Spring Boot没有采用@ContextConfiguration
注解,而是使用@SpringApplicationConfiguration
来利用SpringApplicationContextLoader
上下文加载器来测试应用。
插入、更新和删除数据的测试方法与上一教程完全相同。有关更多信息,请参阅使用jOOQ与Spring的第5节。所有测试应该能够成功执行,证明jOOQ完全被Spring Boot支持。
5. 总结
本教程深入探讨了在Spring中使用jOOQ的方法。它介绍了Spring Boot应用如何利用jOOQ以类型安全的方式与数据库交互。
这些示例和代码片段的实现可以在GitHub项目中找到。