天天看点

飞5的Spring Boot2(23)- JOOQ

使用H2的web控制台

H2数据库提供一个基于浏览器的控制台,Spring Boot可以为你自动配置。如果以下条件满足,则控制台会被自动配置:

  • 你正在开发一个web应用。
  • 添加com.h2database:h2依赖。
  • 你正在使用Spring Boot开发者工具。

注意

如果你没有使用Spring Boot的开发者工具,仍想利用H2的控制台,可以设置spring.h2.console.enabled属性值为true。H2控制台应该只用于开发期间,所以确保生产环境没有设置spring.h2.console.enabled。

改变H2控制台路径

H2控制台路径默认为/h2-console,你可以通过设置spring.h2.console.path属性自定义该路径。

保护H2控制台

当添加Spring Security依赖,并且启用基本认证时,Spring Boot自动使用基本认证保护H2控制台。以下属性可用于自定义安全配置:

  • security.user.role
  • security.basic.authorize-mode
  • security.basic.enabled

如果你没有使用Spring Boot的开发工具,但仍想使用H2的控制台,你可以spring.h2.console.enabled使用值来配置属性true。

H2控制台仅供在开发过程中使用,因此您应注意确保spring.h2.console.enabled不会true在生产中使用。

使用jOOQ

Java面向对象查询(jOOQ)是Data Geekery的一个明星产品,可以从数据库生成Java代码,让你通过它的流式API构建类型安全的SQL查询。不管是商业版,还是开源版本都能跟Spring Boot一块使用。

飞5的Spring Boot2(23)- JOOQ

代码生成

为了使用jOOQ类型安全的查询,你需要从数据库schema生成Java类,具体可参考jOOQ用户指南。如果正在使用jooq-codegen-maven插件(也使用spring-boot-starter-parent “parent POM”),你可以安全的省略插件的标签,也可以使用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>      

使用DSLContext

jOOQ提供的流式(fluent)API是通过org.jooq.DSLContext接口初始化的,Spring Boot将自动配置一个DSLContext为Spring Bean,并将它跟应用的DataSource连接起来。想要使用DSLContext,只需@Autowire注入它:

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

注意

jOOQ手册倾向于使用一个名为create的变量持有DSLContext,示例中也是这样做的。

然后你就可以使用DSLContext构造查询:

1public List<GregorianCalendar> authorsBornAfter1980() {
2return 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方言

除非spring.jooq.sql-dialect已配置属性,否则Spring Boot将确定用于数据源的SQL方言。如果Spring Boot无法检测到该方言,则使用该方言DEFAULT。

注意

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

自定义jOOQ

通过在application.properties中设置spring.jooq.sql-dialect属性,你可以自定义jOOQ使用的SQL方言(dialect)。例如,设置方言为Postgres:

1spring.jooq.sql-dialect=Postgres      
  • ConnectionProvider
  • TransactionProvider
  • RecordMapperProvider
  • RecordListenerProvider
  • ExecuteListenerProvider
  • VisitListenerProvider