Merge pull request #2804 from aahlenst/jooq-starter

* pr/2804:
  Document jOOQ support
  Add jOOQ sample application
  Add support for jOOQ
pull/3128/merge
Phillip Webb 10 years ago
commit d9466cfcf5

@ -510,6 +510,11 @@
<artifactId>aspectjweaver</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq</artifactId>
<optional>true</optional>
</dependency>
<!-- Annotation processing -->
<dependency>
<groupId>org.springframework.boot</groupId>

@ -0,0 +1,137 @@
/*
* Copyright 2012-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.jooq;
import javax.sql.DataSource;
import org.jooq.ConnectionProvider;
import org.jooq.DSLContext;
import org.jooq.ExecuteListenerProvider;
import org.jooq.RecordListenerProvider;
import org.jooq.RecordMapperProvider;
import org.jooq.SQLDialect;
import org.jooq.TransactionProvider;
import org.jooq.VisitListenerProvider;
import org.jooq.conf.Settings;
import org.jooq.impl.DataSourceConnectionProvider;
import org.jooq.impl.DefaultConfiguration;
import org.jooq.impl.DefaultDSLContext;
import org.jooq.impl.DefaultExecuteListenerProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.util.StringUtils;
/**
* {@link EnableAutoConfiguration Auto-configuration} for JOOQ.
*
* @author Andreas Ahlenstorf
* @since 1.3.0
*/
@Configuration
@ConditionalOnClass(DSLContext.class)
@ConditionalOnBean(DataSource.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class JooqAutoConfiguration {
@Bean
@ConditionalOnMissingBean(DataSourceConnectionProvider.class)
public DataSourceConnectionProvider dataSourceConnectionProvider(DataSource dataSource) {
return new DataSourceConnectionProvider(new TransactionAwareDataSourceProxy(
dataSource));
}
@Bean
@ConditionalOnBean(PlatformTransactionManager.class)
public TransactionProvider transactionProvider(PlatformTransactionManager txManager) {
return new SpringTransactionProvider(txManager);
}
@Bean
public ExecuteListenerProvider jooqExceptionTranslatorExecuteListenerProvider() {
return new DefaultExecuteListenerProvider(new JooqExceptionTranslator());
}
@Configuration
@ConditionalOnMissingBean(DSLContext.class)
@EnableConfigurationProperties(JooqProperties.class)
public static class DslContextConfiguration {
@Autowired
private JooqProperties properties = new JooqProperties();
@Autowired
private ConnectionProvider connectionProvider;
@Autowired(required = false)
private TransactionProvider transactionProvider;
@Autowired(required = false)
private RecordMapperProvider recordMapperProvider;
@Autowired(required = false)
private Settings settings;
@Autowired(required = false)
private RecordListenerProvider[] recordListenerProviders;
@Autowired
private ExecuteListenerProvider[] executeListenerProviders;
@Autowired(required = false)
private VisitListenerProvider[] visitListenerProviders;
@Bean
public DefaultDSLContext dslContext(org.jooq.Configuration configuration) {
return new DefaultDSLContext(configuration);
}
@Bean
@ConditionalOnMissingBean(org.jooq.Configuration.class)
public DefaultConfiguration jooqConfiguration() {
DefaultConfiguration configuration = new DefaultConfiguration();
if (!StringUtils.isEmpty(this.properties.getSqlDialect())) {
configuration.set(SQLDialect.valueOf(this.properties.getSqlDialect()));
}
configuration.set(this.connectionProvider);
if (this.transactionProvider != null) {
configuration.set(this.transactionProvider);
}
if (this.recordMapperProvider != null) {
configuration.set(this.recordMapperProvider);
}
if (this.settings != null) {
configuration.set(this.settings);
}
configuration.set(this.recordListenerProviders);
configuration.set(this.executeListenerProviders);
configuration.set(this.visitListenerProviders);
return configuration;
}
}
}

@ -0,0 +1,90 @@
/*
* Copyright 2012-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.jooq;
import java.sql.SQLException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jooq.ExecuteContext;
import org.jooq.SQLDialect;
import org.jooq.impl.DefaultExecuteListener;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator;
import org.springframework.jdbc.support.SQLExceptionTranslator;
import org.springframework.jdbc.support.SQLStateSQLExceptionTranslator;
/**
* Transforms {@link java.sql.SQLException} into a Spring-specific @{link
* DataAccessException}.
*
* @author Lukas Eder
* @author Andreas Ahlenstorf
* @author Phillip Webb
*/
class JooqExceptionTranslator extends DefaultExecuteListener {
// Based on the jOOQ-spring-example from https://github.com/jOOQ/jOOQ
private static final Log logger = LogFactory.getLog(JooqExceptionTranslator.class);
@Override
public void exception(ExecuteContext context) {
SQLExceptionTranslator translator = getTranslator(context);
// The exception() callback is not only triggered for SQL exceptions but also for
// "normal" exceptions. In those cases sqlException() returns null.
SQLException exception = context.sqlException();
while (exception != null) {
handle(context, translator, exception);
exception = exception.getNextException();
}
}
private SQLExceptionTranslator getTranslator(ExecuteContext context) {
SQLDialect dialect = context.configuration().dialect();
if (dialect != null) {
return new SQLErrorCodeSQLExceptionTranslator(dialect.name());
}
return new SQLStateSQLExceptionTranslator();
}
/**
* Handle a single exception in the chain. SQLExceptions might be nested multiple
* levels deep. The outermost exception is usually the least interesting one
* ("Call getNextException to see the cause."). Therefore the innermost exception is
* propagated and all other exceptions are logged.
* @param context the execute context
* @param translator the exception translator
* @param exception the exception
*/
private void handle(ExecuteContext context, SQLExceptionTranslator translator,
SQLException exception) {
DataAccessException translated = translate(context, translator, exception);
if (exception.getNextException() == null) {
context.exception(translated);
}
else {
logger.error("Execution of SQL statement failed.", translated);
}
}
private DataAccessException translate(ExecuteContext context,
SQLExceptionTranslator translator, SQLException exception) {
return translator.translate("jOOQ", context.sql(), exception);
}
}

@ -0,0 +1,44 @@
/*
* Copyright 2012-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.jooq;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* Configuration properties for the JOOQ database library.
*
* @author Andreas Ahlenstorf
* @since 1.3.0
*/
@ConfigurationProperties(prefix = "spring.jooq")
public class JooqProperties {
/**
* SQLDialect JOOQ used when communicating with the configured datasource, e.g.
* "POSTGRES".
*/
private String sqlDialect;
public String getSqlDialect() {
return this.sqlDialect;
}
public void setSqlDialect(String sqlDialect) {
this.sqlDialect = sqlDialect;
}
}

@ -0,0 +1,43 @@
/*
* Copyright 2012-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.jooq;
import org.jooq.Transaction;
import org.springframework.transaction.TransactionStatus;
/**
* Adapts a Spring transaction for JOOQ.
*
* @author Lukas Eder
* @author Andreas Ahlenstorf
* @author Phillip Webb
*/
class SpringTransaction implements Transaction {
// Based on the jOOQ-spring-example from https://github.com/jOOQ/jOOQ
private final TransactionStatus transactionStatus;
public SpringTransaction(TransactionStatus transactionStatus) {
this.transactionStatus = transactionStatus;
}
public TransactionStatus getTxStatus() {
return this.transactionStatus;
}
}

@ -0,0 +1,66 @@
/*
* Copyright 2012-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.jooq;
import org.jooq.TransactionContext;
import org.jooq.TransactionProvider;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
/**
* Allows Spring Transaction to be used with JOOQ.
*
* @author Lukas Eder
* @author Andreas Ahlenstorf
* @author Phillip Webb
*/
class SpringTransactionProvider implements TransactionProvider {
// Based on the jOOQ-spring-example from https://github.com/jOOQ/jOOQ
private final PlatformTransactionManager transactionManager;
SpringTransactionProvider(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
@Override
public void begin(TransactionContext context) {
TransactionDefinition definition = new DefaultTransactionDefinition(
TransactionDefinition.PROPAGATION_NESTED);
TransactionStatus status = this.transactionManager.getTransaction(definition);
context.transaction(new SpringTransaction(status));
}
@Override
public void commit(TransactionContext ctx) {
this.transactionManager.commit(getTransactionStatus(ctx));
}
@Override
public void rollback(TransactionContext ctx) {
this.transactionManager.rollback(getTransactionStatus(ctx));
}
private TransactionStatus getTransactionStatus(TransactionContext ctx) {
SpringTransaction transaction = (SpringTransaction) ctx.transaction();
return transaction.getTxStatus();
}
}

@ -0,0 +1,20 @@
/*
* Copyright 2012-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Auto-configuration for JOOQ.
*/
package org.springframework.boot.autoconfigure.jooq;

@ -39,6 +39,7 @@ org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchDataAutoConfig
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,\

@ -0,0 +1,266 @@
/*
* Copyright 2012-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.jooq;
import javax.sql.DataSource;
import org.hamcrest.Matcher;
import org.jooq.DSLContext;
import org.jooq.ExecuteListener;
import org.jooq.ExecuteListenerProvider;
import org.jooq.Record;
import org.jooq.RecordListener;
import org.jooq.RecordListenerProvider;
import org.jooq.RecordMapper;
import org.jooq.RecordMapperProvider;
import org.jooq.RecordType;
import org.jooq.SQLDialect;
import org.jooq.TransactionalRunnable;
import org.jooq.VisitListener;
import org.jooq.VisitListenerProvider;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.test.EnvironmentTestUtils;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
/**
* Tests for {@link JooqAutoConfiguration}.
*
* @author Andreas Ahlenstorf
* @author Phillip Webb
*/
public class JooqAutoConfigurationTests {
private static final String[] NO_BEANS = {};
@Rule
public ExpectedException thrown = ExpectedException.none();
private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
@Before
public void init() {
EnvironmentTestUtils.addEnvironment(this.context,
"spring.datasource.name:jooqtest");
EnvironmentTestUtils.addEnvironment(this.context, "spring.jooq.sql-dialect:H2");
}
@After
public void close() {
if (this.context != null) {
this.context.close();
}
}
@Test
public void noDataSource() throws Exception {
registerAndRefresh(JooqAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
assertEquals(0, this.context.getBeanNamesForType(DSLContext.class).length);
}
@Test
public void jooqWithoutTx() throws Exception {
registerAndRefresh(JooqDataSourceConfiguration.class,
JooqAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class);
assertThat(getBeanNames(PlatformTransactionManager.class), equalTo(NO_BEANS));
assertThat(getBeanNames(SpringTransactionProvider.class), equalTo(NO_BEANS));
DSLContext dsl = this.context.getBean(DSLContext.class);
dsl.execute("create table jooqtest (name varchar(255) primary key);");
dsl.transaction(new AssertFetch(dsl, "select count(*) as total from jooqtest;",
equalTo("0")));
dsl.transaction(new ExecuteSql(dsl, "insert into jooqtest (name) values ('foo');"));
dsl.transaction(new AssertFetch(dsl, "select count(*) as total from jooqtest;",
equalTo("1")));
try {
dsl.transaction(new ExecuteSql(dsl,
"insert into jooqtest (name) values ('bar');",
"insert into jooqtest (name) values ('foo');"));
fail("An DataIntegrityViolationException should have been thrown.");
}
catch (DataIntegrityViolationException ex) {
}
dsl.transaction(new AssertFetch(dsl, "select count(*) as total from jooqtest;",
equalTo("2")));
}
@Test
public void jooqWithTx() throws Exception {
registerAndRefresh(JooqDataSourceConfiguration.class,
PropertyPlaceholderAutoConfiguration.class, TxManagerConfiguration.class,
JooqAutoConfiguration.class);
this.context.getBean(PlatformTransactionManager.class);
DSLContext dsl = this.context.getBean(DSLContext.class);
assertEquals(SQLDialect.H2, dsl.configuration().dialect());
dsl.execute("create table jooqtest_tx (name varchar(255) primary key);");
dsl.transaction(new AssertFetch(dsl,
"select count(*) as total from jooqtest_tx;", equalTo("0")));
dsl.transaction(new ExecuteSql(dsl,
"insert into jooqtest_tx (name) values ('foo');"));
dsl.transaction(new AssertFetch(dsl,
"select count(*) as total from jooqtest_tx;", equalTo("1")));
try {
dsl.transaction(new ExecuteSql(dsl,
"insert into jooqtest (name) values ('bar');",
"insert into jooqtest (name) values ('foo');"));
fail("A DataIntegrityViolationException should have been thrown.");
}
catch (DataIntegrityViolationException ex) {
}
dsl.transaction(new AssertFetch(dsl,
"select count(*) as total from jooqtest_tx;", equalTo("1")));
}
@Test
public void customProvidersArePickedUp() {
registerAndRefresh(JooqDataSourceConfiguration.class,
PropertyPlaceholderAutoConfiguration.class, TxManagerConfiguration.class,
TestRecordMapperProvider.class, TestRecordListenerProvider.class,
TestExecuteListenerProvider.class, TestVisitListenerProvider.class,
JooqAutoConfiguration.class);
DSLContext dsl = this.context.getBean(DSLContext.class);
assertEquals(TestRecordMapperProvider.class, dsl.configuration()
.recordMapperProvider().getClass());
assertThat(dsl.configuration().recordListenerProviders().length, equalTo(1));
assertThat(dsl.configuration().executeListenerProviders().length, equalTo(2));
assertThat(dsl.configuration().visitListenerProviders().length, equalTo(1));
}
private void registerAndRefresh(Class<?>... annotatedClasses) {
this.context.register(annotatedClasses);
this.context.refresh();
}
private String[] getBeanNames(Class<?> type) {
return this.context.getBeanNamesForType(type);
}
private static class AssertFetch implements TransactionalRunnable {
private final DSLContext dsl;
private final String sql;
private final Matcher<? super String> matcher;
public AssertFetch(DSLContext dsl, String sql, Matcher<? super String> matcher) {
this.dsl = dsl;
this.sql = sql;
this.matcher = matcher;
}
@Override
public void run(org.jooq.Configuration configuration) throws Exception {
assertThat(this.dsl.fetch(this.sql).getValue(0, 0).toString(), this.matcher);
}
}
private static class ExecuteSql implements TransactionalRunnable {
private final DSLContext dsl;
private final String[] sql;
public ExecuteSql(DSLContext dsl, String... sql) {
this.dsl = dsl;
this.sql = sql;
}
@Override
public void run(org.jooq.Configuration configuration) throws Exception {
for (String statement : this.sql) {
this.dsl.execute(statement);
}
}
}
@Configuration
protected static class JooqDataSourceConfiguration {
@Bean
public DataSource jooqDataSource() {
return DataSourceBuilder.create().url("jdbc:hsqldb:mem:jooqtest")
.username("sa").build();
}
}
@Configuration
protected static class TxManagerConfiguration {
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
protected static class TestRecordMapperProvider implements RecordMapperProvider {
@Override
public <R extends Record, E> RecordMapper<R, E> provide(RecordType<R> recordType,
Class<? extends E> aClass) {
return null;
}
}
protected static class TestRecordListenerProvider implements RecordListenerProvider {
@Override
public RecordListener provide() {
return null;
}
}
protected static class TestExecuteListenerProvider implements ExecuteListenerProvider {
@Override
public ExecuteListener provide() {
return null;
}
}
protected static class TestVisitListenerProvider implements VisitListenerProvider {
@Override
public VisitListener provide() {
return null;
}
}
}

@ -100,6 +100,7 @@
<joda-time.version>2.8.1</joda-time.version>
<jolokia.version>1.3.1</jolokia.version>
<json.version>20141113</json.version>
<jooq.version>3.6.2</jooq.version>
<json-path.version>2.0.0</json-path.version>
<jstl.version>1.2</jstl.version>
<junit.version>4.12</junit.version>
@ -318,6 +319,11 @@
<artifactId>spring-boot-starter-jetty</artifactId>
<version>1.3.0.BUILD-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jooq</artifactId>
<version>1.3.0.BUILD-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
@ -1477,6 +1483,21 @@
<artifactId>json</artifactId>
<version>${json.version}</version>
</dependency>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq</artifactId>
<version>${jooq.version}</version>
</dependency>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-meta</artifactId>
<version>${jooq.version}</version>
</dependency>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen</artifactId>
<version>${jooq.version}</version>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
@ -1836,6 +1857,11 @@
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<version>${jooq.version}</version>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>

@ -340,6 +340,9 @@ content into your application; rather pick only the properties that you need.
spring.jta.log-dir= # transaction log dir
spring.jta.*= # technology specific configuration
# JOOQ ({sc-spring-boot-autoconfigure}/jooq/JooqAutoConfiguration.{sc-ext}[JooqAutoConfiguration])
spring.jooq.sql-dialect=
# ATOMIKOS
spring.jta.atomikos.connectionfactory.borrow-connection-timeout=30 # Timeout, in seconds, for borrowing connections from the pool
spring.jta.atomikos.connectionfactory.ignore-session-transacted-flag=true # Whether or not to ignore the transacted flag when creating session

@ -1998,6 +1998,114 @@ Hibernate autoconfig is active because the `ddl-auto` settings are more fine-gra
[[boot-features-jooq]]
== Using jOOQ
Java Object Oriented Querying (http://www.jooq.org/[jOOQ]) is a popular product from
http://www.datageekery.com/[Data Geekery] which generates Java code from your
database, and lets you build type safe SQL queries through its fluent API. Both the
commercial and open source editions can be used with Spring Boot.
=== Code Generation
In oder to use jOOQ type-safe queries, you need to generate Java classes from your
database schema. You can follow the instructions in the
http://www.jooq.org/doc/3.6/manual-single-page/#jooq-in-7-steps-step3[jOOQ user manual].
If you are using the `jooq-codegen-maven` plugin (and you also use the
`spring-boot-starter-parent` "`parent POM`") you can safely omit the plugin's `<version>`
tag. You can also use Spring Boot defined version variables (e.g. `h2.version`) to
declare the plugin's database dependency. Here's an example:
[source,xml,indent=0]
----
<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
The fluent API offered by jOOQ is initiated via the `org.jooq.DSLContext` interface.
Spring Boot will auto-configure a `DSLContext` as a Spring Bean and connect it to your
application `DataSource`. To use the `DSLContext` you can just `@Autowire` it:
[source,java,indent=0]
----
@Component
public class JooqExample implements CommandLineRunner {
private final DSLContext create;
@Autowired
public JooqExample(DSLContext dlsContext) {
this.create = dlsContext;
}
}
----
TIP: The jOOQ manual tends to use a variable named `create` to hold the `DSLContext`,
we've done the same for this example.
You can then use the `DSLContext` to construct your queries:
[source,java,indent=0]
----
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);
}
----
=== Customizing jOOQ
You can customize the SQL dialect used by jOOQ by setting `spring.jooq.sql-dialect` in
your `application.properties`. For example, to specify Postgres you would add:
[source,properties,indent=0]
----
spring.jooq.sql-dialect=Postgres
----
More advanced customizations can be achieved by defining your own `@Bean` definitions
which will be used when the jOOQ `Configuration` is created. You can define beans for
the following jOOQ Types:
* `ConnectionProvider`
* `TransactionProvider`
* `RecordMapperProvider`
* `RecordListenerProvider`
* `ExecuteListenerProvider`
* `VisitListenerProvider`
You can also create your own `org.jooq.Configuration` `@Bean` if you want to take
complete control of the jOOQ configuration.
[[boot-features-nosql]]
== Working with NoSQL technologies
Spring Data provides additional projects that help you access a variety of NoSQL

@ -33,6 +33,7 @@
<module>spring-boot-sample-cache</module>
<module>spring-boot-sample-data-elasticsearch</module>
<module>spring-boot-sample-data-gemfire</module>
<module>spring-boot-sample-data-jooq</module>
<module>spring-boot-sample-data-jpa</module>
<module>spring-boot-sample-data-mongodb</module>
<module>spring-boot-sample-data-redis</module>

@ -0,0 +1,9 @@
== jOOQ Sample
To rerun the code generator:
[indent=0]
----
$ rm -fr gensrc
$ mvn clean generate-sources -Pgenerate
----

@ -0,0 +1,81 @@
/**
* This class is generated by jOOQ
*/
package sample.jooq.domain;
import javax.annotation.Generated;
import org.jooq.ForeignKey;
import org.jooq.UniqueKey;
import org.jooq.impl.AbstractKeys;
import sample.jooq.domain.tables.Author;
import sample.jooq.domain.tables.Book;
import sample.jooq.domain.tables.BookStore;
import sample.jooq.domain.tables.BookToBookStore;
import sample.jooq.domain.tables.Language;
import sample.jooq.domain.tables.records.AuthorRecord;
import sample.jooq.domain.tables.records.BookRecord;
import sample.jooq.domain.tables.records.BookStoreRecord;
import sample.jooq.domain.tables.records.BookToBookStoreRecord;
import sample.jooq.domain.tables.records.LanguageRecord;
/**
* A class modelling foreign key relationships between tables of the <code>PUBLIC</code>
* schema
*/
@Generated(
value = {
"http://www.jooq.org",
"jOOQ version:3.6.2"
},
comments = "This class is generated by jOOQ"
)
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class Keys {
// -------------------------------------------------------------------------
// IDENTITY definitions
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
// UNIQUE and PRIMARY KEY definitions
// -------------------------------------------------------------------------
public static final UniqueKey<LanguageRecord> CONSTRAINT_C = UniqueKeys0.CONSTRAINT_C;
public static final UniqueKey<AuthorRecord> CONSTRAINT_7 = UniqueKeys0.CONSTRAINT_7;
public static final UniqueKey<BookRecord> CONSTRAINT_1 = UniqueKeys0.CONSTRAINT_1;
public static final UniqueKey<BookStoreRecord> CONSTRAINT_F = UniqueKeys0.CONSTRAINT_F;
public static final UniqueKey<BookToBookStoreRecord> CONSTRAINT_2 = UniqueKeys0.CONSTRAINT_2;
// -------------------------------------------------------------------------
// FOREIGN KEY definitions
// -------------------------------------------------------------------------
public static final ForeignKey<BookRecord, AuthorRecord> FK_BOOK_AUTHOR = ForeignKeys0.FK_BOOK_AUTHOR;
public static final ForeignKey<BookRecord, LanguageRecord> FK_BOOK_LANGUAGE = ForeignKeys0.FK_BOOK_LANGUAGE;
public static final ForeignKey<BookToBookStoreRecord, BookStoreRecord> FK_B2BS_BOOK_STORE = ForeignKeys0.FK_B2BS_BOOK_STORE;
public static final ForeignKey<BookToBookStoreRecord, BookRecord> FK_B2BS_BOOK = ForeignKeys0.FK_B2BS_BOOK;
// -------------------------------------------------------------------------
// [#1459] distribute members to avoid static initialisers > 64kb
// -------------------------------------------------------------------------
private static class UniqueKeys0 extends AbstractKeys {
public static final UniqueKey<LanguageRecord> CONSTRAINT_C = createUniqueKey(Language.LANGUAGE, Language.LANGUAGE.ID);
public static final UniqueKey<AuthorRecord> CONSTRAINT_7 = createUniqueKey(Author.AUTHOR, Author.AUTHOR.ID);
public static final UniqueKey<BookRecord> CONSTRAINT_1 = createUniqueKey(Book.BOOK, Book.BOOK.ID);
public static final UniqueKey<BookStoreRecord> CONSTRAINT_F = createUniqueKey(BookStore.BOOK_STORE, BookStore.BOOK_STORE.NAME);
public static final UniqueKey<BookToBookStoreRecord> CONSTRAINT_2 = createUniqueKey(BookToBookStore.BOOK_TO_BOOK_STORE, BookToBookStore.BOOK_TO_BOOK_STORE.NAME, BookToBookStore.BOOK_TO_BOOK_STORE.BOOK_ID);
}
private static class ForeignKeys0 extends AbstractKeys {
public static final ForeignKey<BookRecord, AuthorRecord> FK_BOOK_AUTHOR = createForeignKey(sample.jooq.domain.Keys.CONSTRAINT_7, Book.BOOK, Book.BOOK.AUTHOR_ID);
public static final ForeignKey<BookRecord, LanguageRecord> FK_BOOK_LANGUAGE = createForeignKey(sample.jooq.domain.Keys.CONSTRAINT_C, Book.BOOK, Book.BOOK.LANGUAGE_ID);
public static final ForeignKey<BookToBookStoreRecord, BookStoreRecord> FK_B2BS_BOOK_STORE = createForeignKey(sample.jooq.domain.Keys.CONSTRAINT_F, BookToBookStore.BOOK_TO_BOOK_STORE, BookToBookStore.BOOK_TO_BOOK_STORE.NAME);
public static final ForeignKey<BookToBookStoreRecord, BookRecord> FK_B2BS_BOOK = createForeignKey(sample.jooq.domain.Keys.CONSTRAINT_1, BookToBookStore.BOOK_TO_BOOK_STORE, BookToBookStore.BOOK_TO_BOOK_STORE.BOOK_ID);
}
}

@ -0,0 +1,65 @@
/**
* This class is generated by jOOQ
*/
package sample.jooq.domain;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Generated;
import org.jooq.Table;
import org.jooq.impl.SchemaImpl;
import sample.jooq.domain.tables.Author;
import sample.jooq.domain.tables.Book;
import sample.jooq.domain.tables.BookStore;
import sample.jooq.domain.tables.BookToBookStore;
import sample.jooq.domain.tables.Language;
/**
* This class is generated by jOOQ.
*/
@Generated(
value = {
"http://www.jooq.org",
"jOOQ version:3.6.2"
},
comments = "This class is generated by jOOQ"
)
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class Public extends SchemaImpl {
private static final long serialVersionUID = 1051839433;
/**
* The reference instance of <code>PUBLIC</code>
*/
public static final Public PUBLIC = new Public();
/**
* No further instances allowed
*/
private Public() {
super("PUBLIC");
}
@Override
public final List<Table<?>> getTables() {
List result = new ArrayList();
result.addAll(getTables0());
return result;
}
private final List<Table<?>> getTables0() {
return Arrays.<Table<?>>asList(
Language.LANGUAGE,
Author.AUTHOR,
Book.BOOK,
BookStore.BOOK_STORE,
BookToBookStore.BOOK_TO_BOOK_STORE);
}
}

@ -0,0 +1,53 @@
/**
* This class is generated by jOOQ
*/
package sample.jooq.domain;
import javax.annotation.Generated;
import sample.jooq.domain.tables.Author;
import sample.jooq.domain.tables.Book;
import sample.jooq.domain.tables.BookStore;
import sample.jooq.domain.tables.BookToBookStore;
import sample.jooq.domain.tables.Language;
/**
* Convenience access to all tables in PUBLIC
*/
@Generated(
value = {
"http://www.jooq.org",
"jOOQ version:3.6.2"
},
comments = "This class is generated by jOOQ"
)
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class Tables {
/**
* The table PUBLIC.LANGUAGE
*/
public static final Language LANGUAGE = sample.jooq.domain.tables.Language.LANGUAGE;
/**
* The table PUBLIC.AUTHOR
*/
public static final Author AUTHOR = sample.jooq.domain.tables.Author.AUTHOR;
/**
* The table PUBLIC.BOOK
*/
public static final Book BOOK = sample.jooq.domain.tables.Book.BOOK;
/**
* The table PUBLIC.BOOK_STORE
*/
public static final BookStore BOOK_STORE = sample.jooq.domain.tables.BookStore.BOOK_STORE;
/**
* The table PUBLIC.BOOK_TO_BOOK_STORE
*/
public static final BookToBookStore BOOK_TO_BOOK_STORE = sample.jooq.domain.tables.BookToBookStore.BOOK_TO_BOOK_STORE;
}

@ -0,0 +1,134 @@
/**
* This class is generated by jOOQ
*/
package sample.jooq.domain.tables;
import java.sql.Date;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Generated;
import org.jooq.Field;
import org.jooq.Table;
import org.jooq.TableField;
import org.jooq.UniqueKey;
import org.jooq.impl.TableImpl;
import sample.jooq.domain.Keys;
import sample.jooq.domain.Public;
import sample.jooq.domain.tables.records.AuthorRecord;
/**
* This class is generated by jOOQ.
*/
@Generated(
value = {
"http://www.jooq.org",
"jOOQ version:3.6.2"
},
comments = "This class is generated by jOOQ"
)
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class Author extends TableImpl<AuthorRecord> {
private static final long serialVersionUID = -1989221607;
/**
* The reference instance of <code>PUBLIC.AUTHOR</code>
*/
public static final Author AUTHOR = new Author();
/**
* The class holding records for this type
*/
@Override
public Class<AuthorRecord> getRecordType() {
return AuthorRecord.class;
}
/**
* The column <code>PUBLIC.AUTHOR.ID</code>.
*/
public final TableField<AuthorRecord, Integer> ID = createField("ID", org.jooq.impl.SQLDataType.INTEGER.nullable(false), this, "");
/**
* The column <code>PUBLIC.AUTHOR.FIRST_NAME</code>.
*/
public final TableField<AuthorRecord, String> FIRST_NAME = createField("FIRST_NAME", org.jooq.impl.SQLDataType.VARCHAR.length(50), this, "");
/**
* The column <code>PUBLIC.AUTHOR.LAST_NAME</code>.
*/
public final TableField<AuthorRecord, String> LAST_NAME = createField("LAST_NAME", org.jooq.impl.SQLDataType.VARCHAR.length(50).nullable(false), this, "");
/**
* The column <code>PUBLIC.AUTHOR.DATE_OF_BIRTH</code>.
*/
public final TableField<AuthorRecord, Date> DATE_OF_BIRTH = createField("DATE_OF_BIRTH", org.jooq.impl.SQLDataType.DATE, this, "");
/**
* The column <code>PUBLIC.AUTHOR.YEAR_OF_BIRTH</code>.
*/
public final TableField<AuthorRecord, Integer> YEAR_OF_BIRTH = createField("YEAR_OF_BIRTH", org.jooq.impl.SQLDataType.INTEGER, this, "");
/**
* The column <code>PUBLIC.AUTHOR.DISTINGUISHED</code>.
*/
public final TableField<AuthorRecord, Byte> DISTINGUISHED = createField("DISTINGUISHED", org.jooq.impl.SQLDataType.TINYINT, this, "");
/**
* Create a <code>PUBLIC.AUTHOR</code> table reference
*/
public Author() {
this("AUTHOR", null);
}
/**
* Create an aliased <code>PUBLIC.AUTHOR</code> table reference
*/
public Author(String alias) {
this(alias, AUTHOR);
}
private Author(String alias, Table<AuthorRecord> aliased) {
this(alias, aliased, null);
}
private Author(String alias, Table<AuthorRecord> aliased, Field<?>[] parameters) {
super(alias, Public.PUBLIC, aliased, parameters, "");
}
/**
* {@inheritDoc}
*/
@Override
public UniqueKey<AuthorRecord> getPrimaryKey() {
return Keys.CONSTRAINT_7;
}
/**
* {@inheritDoc}
*/
@Override
public List<UniqueKey<AuthorRecord>> getKeys() {
return Arrays.<UniqueKey<AuthorRecord>>asList(Keys.CONSTRAINT_7);
}
/**
* {@inheritDoc}
*/
@Override
public Author as(String alias) {
return new Author(alias, this);
}
/**
* Rename this table
*/
public Author rename(String name) {
return new Author(name, null);
}
}

@ -0,0 +1,137 @@
/**
* This class is generated by jOOQ
*/
package sample.jooq.domain.tables;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Generated;
import org.jooq.Field;
import org.jooq.ForeignKey;
import org.jooq.Table;
import org.jooq.TableField;
import org.jooq.UniqueKey;
import org.jooq.impl.TableImpl;
import sample.jooq.domain.Keys;
import sample.jooq.domain.Public;
import sample.jooq.domain.tables.records.BookRecord;
/**
* This class is generated by jOOQ.
*/
@Generated(
value = {
"http://www.jooq.org",
"jOOQ version:3.6.2"
},
comments = "This class is generated by jOOQ"
)
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class Book extends TableImpl<BookRecord> {
private static final long serialVersionUID = 1858247563;
/**
* The reference instance of <code>PUBLIC.BOOK</code>
*/
public static final Book BOOK = new Book();
/**
* The class holding records for this type
*/
@Override
public Class<BookRecord> getRecordType() {
return BookRecord.class;
}
/**
* The column <code>PUBLIC.BOOK.ID</code>.
*/
public final TableField<BookRecord, Integer> ID = createField("ID", org.jooq.impl.SQLDataType.INTEGER.nullable(false), this, "");
/**
* The column <code>PUBLIC.BOOK.AUTHOR_ID</code>.
*/
public final TableField<BookRecord, Integer> AUTHOR_ID = createField("AUTHOR_ID", org.jooq.impl.SQLDataType.INTEGER.nullable(false), this, "");
/**
* The column <code>PUBLIC.BOOK.TITLE</code>.
*/
public final TableField<BookRecord, String> TITLE = createField("TITLE", org.jooq.impl.SQLDataType.VARCHAR.length(400).nullable(false), this, "");
/**
* The column <code>PUBLIC.BOOK.PUBLISHED_IN</code>.
*/
public final TableField<BookRecord, Integer> PUBLISHED_IN = createField("PUBLISHED_IN", org.jooq.impl.SQLDataType.INTEGER.nullable(false), this, "");
/**
* The column <code>PUBLIC.BOOK.LANGUAGE_ID</code>.
*/
public final TableField<BookRecord, Integer> LANGUAGE_ID = createField("LANGUAGE_ID", org.jooq.impl.SQLDataType.INTEGER.nullable(false), this, "");
/**
* Create a <code>PUBLIC.BOOK</code> table reference
*/
public Book() {
this("BOOK", null);
}
/**
* Create an aliased <code>PUBLIC.BOOK</code> table reference
*/
public Book(String alias) {
this(alias, BOOK);
}
private Book(String alias, Table<BookRecord> aliased) {
this(alias, aliased, null);
}
private Book(String alias, Table<BookRecord> aliased, Field<?>[] parameters) {
super(alias, Public.PUBLIC, aliased, parameters, "");
}
/**
* {@inheritDoc}
*/
@Override
public UniqueKey<BookRecord> getPrimaryKey() {
return Keys.CONSTRAINT_1;
}
/**
* {@inheritDoc}
*/
@Override
public List<UniqueKey<BookRecord>> getKeys() {
return Arrays.<UniqueKey<BookRecord>>asList(Keys.CONSTRAINT_1);
}
/**
* {@inheritDoc}
*/
@Override
public List<ForeignKey<BookRecord, ?>> getReferences() {
return Arrays.<ForeignKey<BookRecord, ?>>asList(Keys.FK_BOOK_AUTHOR, Keys.FK_BOOK_LANGUAGE);
}
/**
* {@inheritDoc}
*/
@Override
public Book as(String alias) {
return new Book(alias, this);
}
/**
* Rename this table
*/
public Book rename(String name) {
return new Book(name, null);
}
}

@ -0,0 +1,100 @@
/**
* This class is generated by jOOQ
*/
package sample.jooq.domain.tables;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Generated;
import org.jooq.Field;
import org.jooq.Table;
import org.jooq.TableField;
import org.jooq.UniqueKey;
import org.jooq.impl.TableImpl;
import sample.jooq.domain.Keys;
import sample.jooq.domain.Public;
import sample.jooq.domain.tables.records.BookStoreRecord;
/**
* This class is generated by jOOQ.
*/
@Generated(
value = {
"http://www.jooq.org",
"jOOQ version:3.6.2"
},
comments = "This class is generated by jOOQ"
)
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class BookStore extends TableImpl<BookStoreRecord> {
private static final long serialVersionUID = 1437758195;
/**
* The reference instance of <code>PUBLIC.BOOK_STORE</code>
*/
public static final BookStore BOOK_STORE = new BookStore();
/**
* The class holding records for this type
*/
@Override
public Class<BookStoreRecord> getRecordType() {
return BookStoreRecord.class;
}
/**
* The column <code>PUBLIC.BOOK_STORE.NAME</code>.
*/
public final TableField<BookStoreRecord, String> NAME = createField("NAME", org.jooq.impl.SQLDataType.VARCHAR.length(400).nullable(false), this, "");
/**
* Create a <code>PUBLIC.BOOK_STORE</code> table reference
*/
public BookStore() {
this("BOOK_STORE", null);
}
/**
* Create an aliased <code>PUBLIC.BOOK_STORE</code> table reference
*/
public BookStore(String alias) {
this(alias, BOOK_STORE);
}
private BookStore(String alias, Table<BookStoreRecord> aliased) {
this(alias, aliased, null);
}
private BookStore(String alias, Table<BookStoreRecord> aliased, Field<?>[] parameters) {
super(alias, Public.PUBLIC, aliased, parameters, "");
}
/**
* {@inheritDoc}
*/
@Override
public List<UniqueKey<BookStoreRecord>> getKeys() {
return Arrays.<UniqueKey<BookStoreRecord>>asList(Keys.CONSTRAINT_F);
}
/**
* {@inheritDoc}
*/
@Override
public BookStore as(String alias) {
return new BookStore(alias, this);
}
/**
* Rename this table
*/
public BookStore rename(String name) {
return new BookStore(name, null);
}
}

@ -0,0 +1,127 @@
/**
* This class is generated by jOOQ
*/
package sample.jooq.domain.tables;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Generated;
import org.jooq.Field;
import org.jooq.ForeignKey;
import org.jooq.Table;
import org.jooq.TableField;
import org.jooq.UniqueKey;
import org.jooq.impl.TableImpl;
import sample.jooq.domain.Keys;
import sample.jooq.domain.Public;
import sample.jooq.domain.tables.records.BookToBookStoreRecord;
/**
* This class is generated by jOOQ.
*/
@Generated(
value = {
"http://www.jooq.org",
"jOOQ version:3.6.2"
},
comments = "This class is generated by jOOQ"
)
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class BookToBookStore extends TableImpl<BookToBookStoreRecord> {
private static final long serialVersionUID = -557222072;
/**
* The reference instance of <code>PUBLIC.BOOK_TO_BOOK_STORE</code>
*/
public static final BookToBookStore BOOK_TO_BOOK_STORE = new BookToBookStore();
/**
* The class holding records for this type
*/
@Override
public Class<BookToBookStoreRecord> getRecordType() {
return BookToBookStoreRecord.class;
}
/**
* The column <code>PUBLIC.BOOK_TO_BOOK_STORE.NAME</code>.
*/
public final TableField<BookToBookStoreRecord, String> NAME = createField("NAME", org.jooq.impl.SQLDataType.VARCHAR.length(400).nullable(false), this, "");
/**
* The column <code>PUBLIC.BOOK_TO_BOOK_STORE.BOOK_ID</code>.
*/
public final TableField<BookToBookStoreRecord, Integer> BOOK_ID = createField("BOOK_ID", org.jooq.impl.SQLDataType.INTEGER.nullable(false), this, "");
/**
* The column <code>PUBLIC.BOOK_TO_BOOK_STORE.STOCK</code>.
*/
public final TableField<BookToBookStoreRecord, Integer> STOCK = createField("STOCK", org.jooq.impl.SQLDataType.INTEGER, this, "");
/**
* Create a <code>PUBLIC.BOOK_TO_BOOK_STORE</code> table reference
*/
public BookToBookStore() {
this("BOOK_TO_BOOK_STORE", null);
}
/**
* Create an aliased <code>PUBLIC.BOOK_TO_BOOK_STORE</code> table reference
*/
public BookToBookStore(String alias) {
this(alias, BOOK_TO_BOOK_STORE);
}
private BookToBookStore(String alias, Table<BookToBookStoreRecord> aliased) {
this(alias, aliased, null);
}
private BookToBookStore(String alias, Table<BookToBookStoreRecord> aliased, Field<?>[] parameters) {
super(alias, Public.PUBLIC, aliased, parameters, "");
}
/**
* {@inheritDoc}
*/
@Override
public UniqueKey<BookToBookStoreRecord> getPrimaryKey() {
return Keys.CONSTRAINT_2;
}
/**
* {@inheritDoc}
*/
@Override
public List<UniqueKey<BookToBookStoreRecord>> getKeys() {
return Arrays.<UniqueKey<BookToBookStoreRecord>>asList(Keys.CONSTRAINT_2);
}
/**
* {@inheritDoc}
*/
@Override
public List<ForeignKey<BookToBookStoreRecord, ?>> getReferences() {
return Arrays.<ForeignKey<BookToBookStoreRecord, ?>>asList(Keys.FK_B2BS_BOOK_STORE, Keys.FK_B2BS_BOOK);
}
/**
* {@inheritDoc}
*/
@Override
public BookToBookStore as(String alias) {
return new BookToBookStore(alias, this);
}
/**
* Rename this table
*/
public BookToBookStore rename(String name) {
return new BookToBookStore(name, null);
}
}

@ -0,0 +1,118 @@
/**
* This class is generated by jOOQ
*/
package sample.jooq.domain.tables;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Generated;
import org.jooq.Field;
import org.jooq.Table;
import org.jooq.TableField;
import org.jooq.UniqueKey;
import org.jooq.impl.TableImpl;
import sample.jooq.domain.Keys;
import sample.jooq.domain.Public;
import sample.jooq.domain.tables.records.LanguageRecord;
/**
* This class is generated by jOOQ.
*/
@Generated(
value = {
"http://www.jooq.org",
"jOOQ version:3.6.2"
},
comments = "This class is generated by jOOQ"
)
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class Language extends TableImpl<LanguageRecord> {
private static final long serialVersionUID = -192479483;
/**
* The reference instance of <code>PUBLIC.LANGUAGE</code>
*/
public static final Language LANGUAGE = new Language();
/**
* The class holding records for this type
*/
@Override
public Class<LanguageRecord> getRecordType() {
return LanguageRecord.class;
}
/**
* The column <code>PUBLIC.LANGUAGE.ID</code>.
*/
public final TableField<LanguageRecord, Integer> ID = createField("ID", org.jooq.impl.SQLDataType.INTEGER.nullable(false), this, "");
/**
* The column <code>PUBLIC.LANGUAGE.CD</code>.
*/
public final TableField<LanguageRecord, String> CD = createField("CD", org.jooq.impl.SQLDataType.CHAR.length(2).nullable(false), this, "");
/**
* The column <code>PUBLIC.LANGUAGE.DESCRIPTION</code>.
*/
public final TableField<LanguageRecord, String> DESCRIPTION = createField("DESCRIPTION", org.jooq.impl.SQLDataType.VARCHAR.length(50), this, "");
/**
* Create a <code>PUBLIC.LANGUAGE</code> table reference
*/
public Language() {
this("LANGUAGE", null);
}
/**
* Create an aliased <code>PUBLIC.LANGUAGE</code> table reference
*/
public Language(String alias) {
this(alias, LANGUAGE);
}
private Language(String alias, Table<LanguageRecord> aliased) {
this(alias, aliased, null);
}
private Language(String alias, Table<LanguageRecord> aliased, Field<?>[] parameters) {
super(alias, Public.PUBLIC, aliased, parameters, "");
}
/**
* {@inheritDoc}
*/
@Override
public UniqueKey<LanguageRecord> getPrimaryKey() {
return Keys.CONSTRAINT_C;
}
/**
* {@inheritDoc}
*/
@Override
public List<UniqueKey<LanguageRecord>> getKeys() {
return Arrays.<UniqueKey<LanguageRecord>>asList(Keys.CONSTRAINT_C);
}
/**
* {@inheritDoc}
*/
@Override
public Language as(String alias) {
return new Language(alias, this);
}
/**
* Rename this table
*/
public Language rename(String name) {
return new Language(name, null);
}
}

@ -0,0 +1,339 @@
/**
* This class is generated by jOOQ
*/
package sample.jooq.domain.tables.records;
import java.sql.Date;
import javax.annotation.Generated;
import org.jooq.Field;
import org.jooq.Record1;
import org.jooq.Record6;
import org.jooq.Row6;
import org.jooq.impl.UpdatableRecordImpl;
import sample.jooq.domain.tables.Author;
/**
* This class is generated by jOOQ.
*/
@Generated(
value = {
"http://www.jooq.org",
"jOOQ version:3.6.2"
},
comments = "This class is generated by jOOQ"
)
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class AuthorRecord extends UpdatableRecordImpl<AuthorRecord> implements Record6<Integer, String, String, Date, Integer, Byte> {
private static final long serialVersionUID = -983051550;
/**
* Setter for <code>PUBLIC.AUTHOR.ID</code>.
*/
public void setId(Integer value) {
setValue(0, value);
}
/**
* Getter for <code>PUBLIC.AUTHOR.ID</code>.
*/
public Integer getId() {
return (Integer) getValue(0);
}
/**
* Setter for <code>PUBLIC.AUTHOR.FIRST_NAME</code>.
*/
public void setFirstName(String value) {
setValue(1, value);
}
/**
* Getter for <code>PUBLIC.AUTHOR.FIRST_NAME</code>.
*/
public String getFirstName() {
return (String) getValue(1);
}
/**
* Setter for <code>PUBLIC.AUTHOR.LAST_NAME</code>.
*/
public void setLastName(String value) {
setValue(2, value);
}
/**
* Getter for <code>PUBLIC.AUTHOR.LAST_NAME</code>.
*/
public String getLastName() {
return (String) getValue(2);
}
/**
* Setter for <code>PUBLIC.AUTHOR.DATE_OF_BIRTH</code>.
*/
public void setDateOfBirth(Date value) {
setValue(3, value);
}
/**
* Getter for <code>PUBLIC.AUTHOR.DATE_OF_BIRTH</code>.
*/
public Date getDateOfBirth() {
return (Date) getValue(3);
}
/**
* Setter for <code>PUBLIC.AUTHOR.YEAR_OF_BIRTH</code>.
*/
public void setYearOfBirth(Integer value) {
setValue(4, value);
}
/**
* Getter for <code>PUBLIC.AUTHOR.YEAR_OF_BIRTH</code>.
*/
public Integer getYearOfBirth() {
return (Integer) getValue(4);
}
/**
* Setter for <code>PUBLIC.AUTHOR.DISTINGUISHED</code>.
*/
public void setDistinguished(Byte value) {
setValue(5, value);
}
/**
* Getter for <code>PUBLIC.AUTHOR.DISTINGUISHED</code>.
*/
public Byte getDistinguished() {
return (Byte) getValue(5);
}
// -------------------------------------------------------------------------
// Primary key information
// -------------------------------------------------------------------------
/**
* {@inheritDoc}
*/
@Override
public Record1<Integer> key() {
return (Record1) super.key();
}
// -------------------------------------------------------------------------
// Record6 type implementation
// -------------------------------------------------------------------------
/**
* {@inheritDoc}
*/
@Override
public Row6<Integer, String, String, Date, Integer, Byte> fieldsRow() {
return (Row6) super.fieldsRow();
}
/**
* {@inheritDoc}
*/
@Override
public Row6<Integer, String, String, Date, Integer, Byte> valuesRow() {
return (Row6) super.valuesRow();
}
/**
* {@inheritDoc}
*/
@Override
public Field<Integer> field1() {
return Author.AUTHOR.ID;
}
/**
* {@inheritDoc}
*/
@Override
public Field<String> field2() {
return Author.AUTHOR.FIRST_NAME;
}
/**
* {@inheritDoc}
*/
@Override
public Field<String> field3() {
return Author.AUTHOR.LAST_NAME;
}
/**
* {@inheritDoc}
*/
@Override
public Field<Date> field4() {
return Author.AUTHOR.DATE_OF_BIRTH;
}
/**
* {@inheritDoc}
*/
@Override
public Field<Integer> field5() {
return Author.AUTHOR.YEAR_OF_BIRTH;
}
/**
* {@inheritDoc}
*/
@Override
public Field<Byte> field6() {
return Author.AUTHOR.DISTINGUISHED;
}
/**
* {@inheritDoc}
*/
@Override
public Integer value1() {
return getId();
}
/**
* {@inheritDoc}
*/
@Override
public String value2() {
return getFirstName();
}
/**
* {@inheritDoc}
*/
@Override
public String value3() {
return getLastName();
}
/**
* {@inheritDoc}
*/
@Override
public Date value4() {
return getDateOfBirth();
}
/**
* {@inheritDoc}
*/
@Override
public Integer value5() {
return getYearOfBirth();
}
/**
* {@inheritDoc}
*/
@Override
public Byte value6() {
return getDistinguished();
}
/**
* {@inheritDoc}
*/
@Override
public AuthorRecord value1(Integer value) {
setId(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public AuthorRecord value2(String value) {
setFirstName(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public AuthorRecord value3(String value) {
setLastName(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public AuthorRecord value4(Date value) {
setDateOfBirth(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public AuthorRecord value5(Integer value) {
setYearOfBirth(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public AuthorRecord value6(Byte value) {
setDistinguished(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public AuthorRecord values(Integer value1, String value2, String value3, Date value4, Integer value5, Byte value6) {
value1(value1);
value2(value2);
value3(value3);
value4(value4);
value5(value5);
value6(value6);
return this;
}
// -------------------------------------------------------------------------
// Constructors
// -------------------------------------------------------------------------
/**
* Create a detached AuthorRecord
*/
public AuthorRecord() {
super(Author.AUTHOR);
}
/**
* Create a detached, initialised AuthorRecord
*/
public AuthorRecord(Integer id, String firstName, String lastName, Date dateOfBirth, Integer yearOfBirth, Byte distinguished) {
super(Author.AUTHOR);
setValue(0, id);
setValue(1, firstName);
setValue(2, lastName);
setValue(3, dateOfBirth);
setValue(4, yearOfBirth);
setValue(5, distinguished);
}
}

@ -0,0 +1,296 @@
/**
* This class is generated by jOOQ
*/
package sample.jooq.domain.tables.records;
import javax.annotation.Generated;
import org.jooq.Field;
import org.jooq.Record1;
import org.jooq.Record5;
import org.jooq.Row5;
import org.jooq.impl.UpdatableRecordImpl;
import sample.jooq.domain.tables.Book;
/**
* This class is generated by jOOQ.
*/
@Generated(
value = {
"http://www.jooq.org",
"jOOQ version:3.6.2"
},
comments = "This class is generated by jOOQ"
)
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class BookRecord extends UpdatableRecordImpl<BookRecord> implements Record5<Integer, Integer, String, Integer, Integer> {
private static final long serialVersionUID = 220424682;
/**
* Setter for <code>PUBLIC.BOOK.ID</code>.
*/
public void setId(Integer value) {
setValue(0, value);
}
/**
* Getter for <code>PUBLIC.BOOK.ID</code>.
*/
public Integer getId() {
return (Integer) getValue(0);
}
/**
* Setter for <code>PUBLIC.BOOK.AUTHOR_ID</code>.
*/
public void setAuthorId(Integer value) {
setValue(1, value);
}
/**
* Getter for <code>PUBLIC.BOOK.AUTHOR_ID</code>.
*/
public Integer getAuthorId() {
return (Integer) getValue(1);
}
/**
* Setter for <code>PUBLIC.BOOK.TITLE</code>.
*/
public void setTitle(String value) {
setValue(2, value);
}
/**
* Getter for <code>PUBLIC.BOOK.TITLE</code>.
*/
public String getTitle() {
return (String) getValue(2);
}
/**
* Setter for <code>PUBLIC.BOOK.PUBLISHED_IN</code>.
*/
public void setPublishedIn(Integer value) {
setValue(3, value);
}
/**
* Getter for <code>PUBLIC.BOOK.PUBLISHED_IN</code>.
*/
public Integer getPublishedIn() {
return (Integer) getValue(3);
}
/**
* Setter for <code>PUBLIC.BOOK.LANGUAGE_ID</code>.
*/
public void setLanguageId(Integer value) {
setValue(4, value);
}
/**
* Getter for <code>PUBLIC.BOOK.LANGUAGE_ID</code>.
*/
public Integer getLanguageId() {
return (Integer) getValue(4);
}
// -------------------------------------------------------------------------
// Primary key information
// -------------------------------------------------------------------------
/**
* {@inheritDoc}
*/
@Override
public Record1<Integer> key() {
return (Record1) super.key();
}
// -------------------------------------------------------------------------
// Record5 type implementation
// -------------------------------------------------------------------------
/**
* {@inheritDoc}
*/
@Override
public Row5<Integer, Integer, String, Integer, Integer> fieldsRow() {
return (Row5) super.fieldsRow();
}
/**
* {@inheritDoc}
*/
@Override
public Row5<Integer, Integer, String, Integer, Integer> valuesRow() {
return (Row5) super.valuesRow();
}
/**
* {@inheritDoc}
*/
@Override
public Field<Integer> field1() {
return Book.BOOK.ID;
}
/**
* {@inheritDoc}
*/
@Override
public Field<Integer> field2() {
return Book.BOOK.AUTHOR_ID;
}
/**
* {@inheritDoc}
*/
@Override
public Field<String> field3() {
return Book.BOOK.TITLE;
}
/**
* {@inheritDoc}
*/
@Override
public Field<Integer> field4() {
return Book.BOOK.PUBLISHED_IN;
}
/**
* {@inheritDoc}
*/
@Override
public Field<Integer> field5() {
return Book.BOOK.LANGUAGE_ID;
}
/**
* {@inheritDoc}
*/
@Override
public Integer value1() {
return getId();
}
/**
* {@inheritDoc}
*/
@Override
public Integer value2() {
return getAuthorId();
}
/**
* {@inheritDoc}
*/
@Override
public String value3() {
return getTitle();
}
/**
* {@inheritDoc}
*/
@Override
public Integer value4() {
return getPublishedIn();
}
/**
* {@inheritDoc}
*/
@Override
public Integer value5() {
return getLanguageId();
}
/**
* {@inheritDoc}
*/
@Override
public BookRecord value1(Integer value) {
setId(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public BookRecord value2(Integer value) {
setAuthorId(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public BookRecord value3(String value) {
setTitle(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public BookRecord value4(Integer value) {
setPublishedIn(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public BookRecord value5(Integer value) {
setLanguageId(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public BookRecord values(Integer value1, Integer value2, String value3, Integer value4, Integer value5) {
value1(value1);
value2(value2);
value3(value3);
value4(value4);
value5(value5);
return this;
}
// -------------------------------------------------------------------------
// Constructors
// -------------------------------------------------------------------------
/**
* Create a detached BookRecord
*/
public BookRecord() {
super(Book.BOOK);
}
/**
* Create a detached, initialised BookRecord
*/
public BookRecord(Integer id, Integer authorId, String title, Integer publishedIn, Integer languageId) {
super(Book.BOOK);
setValue(0, id);
setValue(1, authorId);
setValue(2, title);
setValue(3, publishedIn);
setValue(4, languageId);
}
}

@ -0,0 +1,119 @@
/**
* This class is generated by jOOQ
*/
package sample.jooq.domain.tables.records;
import javax.annotation.Generated;
import org.jooq.Field;
import org.jooq.Record1;
import org.jooq.Row1;
import org.jooq.impl.TableRecordImpl;
import sample.jooq.domain.tables.BookStore;
/**
* This class is generated by jOOQ.
*/
@Generated(
value = {
"http://www.jooq.org",
"jOOQ version:3.6.2"
},
comments = "This class is generated by jOOQ"
)
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class BookStoreRecord extends TableRecordImpl<BookStoreRecord> implements Record1<String> {
private static final long serialVersionUID = -1969224219;
/**
* Setter for <code>PUBLIC.BOOK_STORE.NAME</code>.
*/
public void setName(String value) {
setValue(0, value);
}
/**
* Getter for <code>PUBLIC.BOOK_STORE.NAME</code>.
*/
public String getName() {
return (String) getValue(0);
}
// -------------------------------------------------------------------------
// Record1 type implementation
// -------------------------------------------------------------------------
/**
* {@inheritDoc}
*/
@Override
public Row1<String> fieldsRow() {
return (Row1) super.fieldsRow();
}
/**
* {@inheritDoc}
*/
@Override
public Row1<String> valuesRow() {
return (Row1) super.valuesRow();
}
/**
* {@inheritDoc}
*/
@Override
public Field<String> field1() {
return BookStore.BOOK_STORE.NAME;
}
/**
* {@inheritDoc}
*/
@Override
public String value1() {
return getName();
}
/**
* {@inheritDoc}
*/
@Override
public BookStoreRecord value1(String value) {
setName(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public BookStoreRecord values(String value1) {
value1(value1);
return this;
}
// -------------------------------------------------------------------------
// Constructors
// -------------------------------------------------------------------------
/**
* Create a detached BookStoreRecord
*/
public BookStoreRecord() {
super(BookStore.BOOK_STORE);
}
/**
* Create a detached, initialised BookStoreRecord
*/
public BookStoreRecord(String name) {
super(BookStore.BOOK_STORE);
setValue(0, name);
}
}

@ -0,0 +1,214 @@
/**
* This class is generated by jOOQ
*/
package sample.jooq.domain.tables.records;
import javax.annotation.Generated;
import org.jooq.Field;
import org.jooq.Record2;
import org.jooq.Record3;
import org.jooq.Row3;
import org.jooq.impl.UpdatableRecordImpl;
import sample.jooq.domain.tables.BookToBookStore;
/**
* This class is generated by jOOQ.
*/
@Generated(
value = {
"http://www.jooq.org",
"jOOQ version:3.6.2"
},
comments = "This class is generated by jOOQ"
)
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class BookToBookStoreRecord extends UpdatableRecordImpl<BookToBookStoreRecord> implements Record3<String, Integer, Integer> {
private static final long serialVersionUID = 1124329527;
/**
* Setter for <code>PUBLIC.BOOK_TO_BOOK_STORE.NAME</code>.
*/
public void setName(String value) {
setValue(0, value);
}
/**
* Getter for <code>PUBLIC.BOOK_TO_BOOK_STORE.NAME</code>.
*/
public String getName() {
return (String) getValue(0);
}
/**
* Setter for <code>PUBLIC.BOOK_TO_BOOK_STORE.BOOK_ID</code>.
*/
public void setBookId(Integer value) {
setValue(1, value);
}
/**
* Getter for <code>PUBLIC.BOOK_TO_BOOK_STORE.BOOK_ID</code>.
*/
public Integer getBookId() {
return (Integer) getValue(1);
}
/**
* Setter for <code>PUBLIC.BOOK_TO_BOOK_STORE.STOCK</code>.
*/
public void setStock(Integer value) {
setValue(2, value);
}
/**
* Getter for <code>PUBLIC.BOOK_TO_BOOK_STORE.STOCK</code>.
*/
public Integer getStock() {
return (Integer) getValue(2);
}
// -------------------------------------------------------------------------
// Primary key information
// -------------------------------------------------------------------------
/**
* {@inheritDoc}
*/
@Override
public Record2<String, Integer> key() {
return (Record2) super.key();
}
// -------------------------------------------------------------------------
// Record3 type implementation
// -------------------------------------------------------------------------
/**
* {@inheritDoc}
*/
@Override
public Row3<String, Integer, Integer> fieldsRow() {
return (Row3) super.fieldsRow();
}
/**
* {@inheritDoc}
*/
@Override
public Row3<String, Integer, Integer> valuesRow() {
return (Row3) super.valuesRow();
}
/**
* {@inheritDoc}
*/
@Override
public Field<String> field1() {
return BookToBookStore.BOOK_TO_BOOK_STORE.NAME;
}
/**
* {@inheritDoc}
*/
@Override
public Field<Integer> field2() {
return BookToBookStore.BOOK_TO_BOOK_STORE.BOOK_ID;
}
/**
* {@inheritDoc}
*/
@Override
public Field<Integer> field3() {
return BookToBookStore.BOOK_TO_BOOK_STORE.STOCK;
}
/**
* {@inheritDoc}
*/
@Override
public String value1() {
return getName();
}
/**
* {@inheritDoc}
*/
@Override
public Integer value2() {
return getBookId();
}
/**
* {@inheritDoc}
*/
@Override
public Integer value3() {
return getStock();
}
/**
* {@inheritDoc}
*/
@Override
public BookToBookStoreRecord value1(String value) {
setName(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public BookToBookStoreRecord value2(Integer value) {
setBookId(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public BookToBookStoreRecord value3(Integer value) {
setStock(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public BookToBookStoreRecord values(String value1, Integer value2, Integer value3) {
value1(value1);
value2(value2);
value3(value3);
return this;
}
// -------------------------------------------------------------------------
// Constructors
// -------------------------------------------------------------------------
/**
* Create a detached BookToBookStoreRecord
*/
public BookToBookStoreRecord() {
super(BookToBookStore.BOOK_TO_BOOK_STORE);
}
/**
* Create a detached, initialised BookToBookStoreRecord
*/
public BookToBookStoreRecord(String name, Integer bookId, Integer stock) {
super(BookToBookStore.BOOK_TO_BOOK_STORE);
setValue(0, name);
setValue(1, bookId);
setValue(2, stock);
}
}

@ -0,0 +1,214 @@
/**
* This class is generated by jOOQ
*/
package sample.jooq.domain.tables.records;
import javax.annotation.Generated;
import org.jooq.Field;
import org.jooq.Record1;
import org.jooq.Record3;
import org.jooq.Row3;
import org.jooq.impl.UpdatableRecordImpl;
import sample.jooq.domain.tables.Language;
/**
* This class is generated by jOOQ.
*/
@Generated(
value = {
"http://www.jooq.org",
"jOOQ version:3.6.2"
},
comments = "This class is generated by jOOQ"
)
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class LanguageRecord extends UpdatableRecordImpl<LanguageRecord> implements Record3<Integer, String, String> {
private static final long serialVersionUID = -1003202585;
/**
* Setter for <code>PUBLIC.LANGUAGE.ID</code>.
*/
public void setId(Integer value) {
setValue(0, value);
}
/**
* Getter for <code>PUBLIC.LANGUAGE.ID</code>.
*/
public Integer getId() {
return (Integer) getValue(0);
}
/**
* Setter for <code>PUBLIC.LANGUAGE.CD</code>.
*/
public void setCd(String value) {
setValue(1, value);
}
/**
* Getter for <code>PUBLIC.LANGUAGE.CD</code>.
*/
public String getCd() {
return (String) getValue(1);
}
/**
* Setter for <code>PUBLIC.LANGUAGE.DESCRIPTION</code>.
*/
public void setDescription(String value) {
setValue(2, value);
}
/**
* Getter for <code>PUBLIC.LANGUAGE.DESCRIPTION</code>.
*/
public String getDescription() {
return (String) getValue(2);
}
// -------------------------------------------------------------------------
// Primary key information
// -------------------------------------------------------------------------
/**
* {@inheritDoc}
*/
@Override
public Record1<Integer> key() {
return (Record1) super.key();
}
// -------------------------------------------------------------------------
// Record3 type implementation
// -------------------------------------------------------------------------
/**
* {@inheritDoc}
*/
@Override
public Row3<Integer, String, String> fieldsRow() {
return (Row3) super.fieldsRow();
}
/**
* {@inheritDoc}
*/
@Override
public Row3<Integer, String, String> valuesRow() {
return (Row3) super.valuesRow();
}
/**
* {@inheritDoc}
*/
@Override
public Field<Integer> field1() {
return Language.LANGUAGE.ID;
}
/**
* {@inheritDoc}
*/
@Override
public Field<String> field2() {
return Language.LANGUAGE.CD;
}
/**
* {@inheritDoc}
*/
@Override
public Field<String> field3() {
return Language.LANGUAGE.DESCRIPTION;
}
/**
* {@inheritDoc}
*/
@Override
public Integer value1() {
return getId();
}
/**
* {@inheritDoc}
*/
@Override
public String value2() {
return getCd();
}
/**
* {@inheritDoc}
*/
@Override
public String value3() {
return getDescription();
}
/**
* {@inheritDoc}
*/
@Override
public LanguageRecord value1(Integer value) {
setId(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public LanguageRecord value2(String value) {
setCd(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public LanguageRecord value3(String value) {
setDescription(value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public LanguageRecord values(Integer value1, String value2, String value3) {
value1(value1);
value2(value2);
value3(value3);
return this;
}
// -------------------------------------------------------------------------
// Constructors
// -------------------------------------------------------------------------
/**
* Create a detached LanguageRecord
*/
public LanguageRecord() {
super(Language.LANGUAGE);
}
/**
* Create a detached, initialised LanguageRecord
*/
public LanguageRecord(Integer id, String cd, String description) {
super(Language.LANGUAGE);
setValue(0, id);
setValue(1, cd);
setValue(2, description);
}
}

@ -0,0 +1,171 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<!-- Your own application should inherit from spring-boot-starter-parent -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-samples</artifactId>
<version>1.3.0.BUILD-SNAPSHOT</version>
</parent>
<artifactId>spring-boot-sample-jooq</artifactId>
<name>Spring Boot jOOQ Sample</name>
<description>Spring Boot jOOQ Sample</description>
<url>http://projects.spring.io/spring-boot/</url>
<organization>
<name>Pivotal Software, Inc.</name>
<url>http://www.spring.io</url>
</organization>
<properties>
<main.basedir>${basedir}/../..</main.basedir>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jooq</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>gensrc/main/java</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<!--This plugin's configuration is used to store Eclipse m2e settings
only. It has no influence on the Maven build itself. -->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.jooq</groupId>
<artifactId>
jooq-codegen-maven
</artifactId>
<versionRange>
[3.6.2,)
</versionRange>
<goals>
<goal>generate</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore></ignore>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<profiles>
<profile>
<id>generate</id>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sql-maven-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>execute</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>${h2.version}</version>
</dependency>
</dependencies>
<configuration>
<driver>org.h2.Driver</driver>
<url>jdbc:h2:~/springbootjooq</url>
<srcFiles>
<srcFile>${basedir}/src/main/resources/reset.sql</srcFile>
<srcFile>${basedir}/src/main/resources/schema.sql</srcFile>
</srcFiles>
</configuration>
</plugin>
<plugin>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</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:~/springbootjooq</url>
</jdbc>
<generator>
<name>org.jooq.util.DefaultGenerator</name>
<database>
<name>org.jooq.util.h2.H2Database</name>
<includes>.*</includes>
<excludes></excludes>
<inputSchema>PUBLIC</inputSchema>
</database>
<target>
<packageName>sample.jooq.domain</packageName>
<directory>${basedir}/gensrc/main/java</directory>
</target>
</generator>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>

@ -0,0 +1,80 @@
/*
* Copyright 2012-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.jooq;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.jooq.DSLContext;
import org.jooq.Query;
import org.jooq.Record;
import org.jooq.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Component;
import static sample.jooq.domain.tables.Author.AUTHOR;
import static sample.jooq.domain.tables.Book.BOOK;
@Component
public class JooqExamples implements CommandLineRunner {
private final DSLContext dsl;
private final JdbcTemplate jdbc;
@Autowired
public JooqExamples(DSLContext dsl, JdbcTemplate jdbc) {
this.dsl = dsl;
this.jdbc = jdbc;
}
@Override
public void run(String... args) throws Exception {
jooqFetch();
jooqSql();
}
private void jooqFetch() {
Result<Record> results = this.dsl.select().from(AUTHOR).fetch();
for (Record result : results) {
Integer id = result.getValue(AUTHOR.ID);
String firstName = result.getValue(AUTHOR.FIRST_NAME);
String lastName = result.getValue(AUTHOR.LAST_NAME);
System.out.println("jOOQ Fetch " + id + " " + firstName + " " + lastName);
}
}
private void jooqSql() {
Query query = this.dsl.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
.from(BOOK).join(AUTHOR).on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
.where(BOOK.PUBLISHED_IN.equal(2015));
Object[] bind = query.getBindValues().toArray(new Object[] {});
List<String> list = this.jdbc.query(query.getSQL(), bind,
new RowMapper<String>() {
@Override
public String mapRow(ResultSet rs, int rowNum) throws SQLException {
return rs.getString(1) + " : " + rs.getString(2) + " "
+ rs.getString(3);
}
});
System.out.println("jOOQ SQL " + list);
}
}

@ -0,0 +1,29 @@
/*
* Copyright 2012-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.jooq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SampleJooqApplication {
public static void main(String[] args) {
SpringApplication.run(SampleJooqApplication.class, args);
}
}

@ -0,0 +1,12 @@
INSERT INTO language VALUES (1, 'EN', 'English');
INSERT INTO author VALUES (1, 'Greg', 'Turnquest', '1804-09-17', 1804, 1);
INSERT INTO author VALUES (2, 'Craig', 'Walls', '1804-09-18', 1804, 1);
INSERT INTO book VALUES (1, 1, 'Learning Spring Boot', 2015, 1);
INSERT INTO book VALUES (2, 2, 'Spring Boot in Action', 2015, 1);
INSERT INTO book_store VALUES ('Barnes & Noble');
INSERT INTO book_to_book_store VALUES ('Barnes & Noble', 1, 10);
INSERT INTO book_to_book_store VALUES ('Barnes & Noble', 2, 3);

@ -0,0 +1,39 @@
CREATE TABLE language (
id NUMBER(7) NOT NULL PRIMARY KEY,
cd CHAR(2) NOT NULL,
description VARCHAR2(50)
);
CREATE TABLE author (
id NUMBER(7) NOT NULL PRIMARY KEY,
first_name VARCHAR2(50),
last_name VARCHAR2(50) NOT NULL,
date_of_birth DATE,
year_of_birth NUMBER(7),
distinguished NUMBER(1)
);
CREATE TABLE book (
id NUMBER(7) NOT NULL PRIMARY KEY,
author_id NUMBER(7) NOT NULL,
title VARCHAR2(400) NOT NULL,
published_in NUMBER(7) NOT NULL,
language_id NUMBER(7) NOT NULL,
CONSTRAINT fk_book_author FOREIGN KEY (author_id) REFERENCES author(id),
CONSTRAINT fk_book_language FOREIGN KEY (language_id) REFERENCES language(id)
);
CREATE TABLE book_store (
name VARCHAR2(400) NOT NULL UNIQUE
);
CREATE TABLE book_to_book_store (
name VARCHAR2(400) NOT NULL,
book_id INTEGER NOT NULL,
stock INTEGER,
PRIMARY KEY(name, book_id),
CONSTRAINT fk_b2bs_book_store FOREIGN KEY (name) REFERENCES book_store (name) ON DELETE CASCADE,
CONSTRAINT fk_b2bs_book FOREIGN KEY (book_id) REFERENCES book (id) ON DELETE CASCADE
);

@ -0,0 +1,46 @@
/*
* Copyright 2012-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.jooq;
import org.junit.Rule;
import org.junit.Test;
import org.springframework.boot.test.OutputCapture;
import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.assertThat;
/**
* Integration tests for {@link SampleJooqApplication}.
*/
public class SampleJooqApplicationTests {
private static final String[] NO_ARGS = {};
@Rule
public OutputCapture out = new OutputCapture();
@Test
public void outputResults() throws Exception {
SampleJooqApplication.main(NO_ARGS);
assertThat(this.out.toString(), containsString("jOOQ Fetch 1 Greg Turnquest"));
assertThat(this.out.toString(), containsString("jOOQ Fetch 2 Craig Walls"));
assertThat(this.out.toString(), containsString("jOOQ SQL "
+ "[Learning Spring Boot : Greg Turnquest, "
+ "Spring Boot in Action : Craig Walls]"));
}
}

@ -41,6 +41,7 @@
<module>spring-boot-starter-jdbc</module>
<module>spring-boot-starter-jersey</module>
<module>spring-boot-starter-jetty</module>
<module>spring-boot-starter-jooq</module>
<module>spring-boot-starter-jta-atomikos</module>
<module>spring-boot-starter-jta-bitronix</module>
<module>spring-boot-starter-logging</module>

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starters</artifactId>
<version>1.3.0.BUILD-SNAPSHOT</version>
</parent>
<artifactId>spring-boot-starter-jooq</artifactId>
<name>Spring Boot JOOQ Starter</name>
<description>Spring Boot JOOQ Starter</description>
<url>http://projects.spring.io/spring-boot/</url>
<organization>
<name>Pivotal Software, Inc.</name>
<url>http://www.spring.io</url>
</organization>
<properties>
<main.basedir>${basedir}/../..</main.basedir>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq</artifactId>
</dependency>
</dependencies>
</project>
Loading…
Cancel
Save