Skip to content

Commit 7eb9843

Browse files
schaudermhalbritter
authored andcommitted
Add property spring.data.jdbc.dialect
See gh-39941
1 parent 2dc30d9 commit 7eb9843

File tree

4 files changed

+187
-1
lines changed

4 files changed

+187
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright 2024 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.data.jdbc;
18+
19+
import org.springframework.boot.context.properties.ConfigurationProperties;
20+
21+
/**
22+
* Configuration properties for Spring Data JDBC.
23+
*
24+
* @author Jens Schauder
25+
* @since 3.3
26+
*/
27+
@ConfigurationProperties(prefix = "spring.data.jdbc")
28+
public class JdbcDataProperties {
29+
30+
/**
31+
* Dialect to use. By default, the dialect is determined by inspecting the database
32+
* connection.
33+
*/
34+
private JdbcDatabaseDialect dialect;
35+
36+
public JdbcDatabaseDialect getDialect() {
37+
return this.dialect;
38+
}
39+
40+
public void setDialect(JdbcDatabaseDialect dialect) {
41+
this.dialect = dialect;
42+
}
43+
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/*
2+
* Copyright 2012-2024 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.data.jdbc;
18+
19+
import java.util.function.Supplier;
20+
21+
import org.springframework.data.jdbc.core.dialect.JdbcDb2Dialect;
22+
import org.springframework.data.jdbc.core.dialect.JdbcMySqlDialect;
23+
import org.springframework.data.jdbc.core.dialect.JdbcPostgresDialect;
24+
import org.springframework.data.jdbc.core.dialect.JdbcSqlServerDialect;
25+
import org.springframework.data.relational.core.dialect.Dialect;
26+
import org.springframework.data.relational.core.dialect.H2Dialect;
27+
import org.springframework.data.relational.core.dialect.HsqlDbDialect;
28+
import org.springframework.data.relational.core.dialect.MariaDbDialect;
29+
import org.springframework.data.relational.core.dialect.OracleDialect;
30+
31+
/**
32+
* List of database dialects that can be configured in Boot for use with Spring Data JDBC.
33+
*
34+
* @author Jens Schauder
35+
* @since 3.3
36+
*/
37+
public enum JdbcDatabaseDialect implements Supplier<Dialect> {
38+
39+
/**
40+
* Provides an instance of {@link JdbcDb2Dialect}.
41+
*/
42+
DB2 {
43+
@Override
44+
public Dialect get() {
45+
return JdbcDb2Dialect.INSTANCE;
46+
}
47+
},
48+
49+
/**
50+
* Provides an instance of {@link H2Dialect}.
51+
*/
52+
H2 {
53+
@Override
54+
public Dialect get() {
55+
return H2Dialect.INSTANCE;
56+
}
57+
},
58+
59+
/**
60+
* Provides an instance of {@link HsqlDbDialect}.
61+
*/
62+
HSQL {
63+
@Override
64+
public Dialect get() {
65+
return HsqlDbDialect.INSTANCE;
66+
}
67+
},
68+
69+
/**
70+
* Provides an instance of {@link MariaDbDialect}.
71+
*/
72+
MARIA {
73+
@Override
74+
public Dialect get() {
75+
return MariaDbDialect.INSTANCE;
76+
}
77+
},
78+
79+
/**
80+
* Provides an instance of {@link JdbcMySqlDialect}.
81+
*/
82+
MYSQL {
83+
@Override
84+
public Dialect get() {
85+
return JdbcMySqlDialect.INSTANCE;
86+
}
87+
},
88+
89+
/**
90+
* Provides an instance of {@link OracleDialect}.
91+
*/
92+
ORACLE {
93+
@Override
94+
public Dialect get() {
95+
return OracleDialect.INSTANCE;
96+
97+
}
98+
},
99+
100+
/**
101+
* Provides an instance of {@link JdbcPostgresDialect}.
102+
*/
103+
POSTGRESQL {
104+
@Override
105+
public Dialect get() {
106+
return JdbcPostgresDialect.INSTANCE;
107+
}
108+
},
109+
110+
/**
111+
* Provides an instance of {@link JdbcSqlServerDialect}.
112+
*/
113+
SQL_SERVER {
114+
@Override
115+
public Dialect get() {
116+
return JdbcSqlServerDialect.INSTANCE;
117+
}
118+
}
119+
120+
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.boot.autoconfigure.domain.EntityScanner;
2929
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
3030
import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;
31+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3132
import org.springframework.context.ApplicationContext;
3233
import org.springframework.context.annotation.Bean;
3334
import org.springframework.context.annotation.Configuration;
@@ -59,6 +60,7 @@
5960
* @author Andy Wilkinson
6061
* @author Stephane Nicoll
6162
* @author Mark Paluch
63+
* @author Jens Schauder
6264
* @since 2.1.0
6365
* @see EnableJdbcRepositories
6466
*/
@@ -67,6 +69,7 @@
6769
@ConditionalOnClass({ NamedParameterJdbcOperations.class, AbstractJdbcConfiguration.class })
6870
@ConditionalOnProperty(prefix = "spring.data.jdbc.repositories", name = "enabled", havingValue = "true",
6971
matchIfMissing = true)
72+
@EnableConfigurationProperties(JdbcDataProperties.class)
7073
public class JdbcRepositoriesAutoConfiguration {
7174

7275
@Configuration(proxyBeanMethods = false)
@@ -82,8 +85,11 @@ static class SpringBootJdbcConfiguration extends AbstractJdbcConfiguration {
8285

8386
private final ApplicationContext applicationContext;
8487

85-
SpringBootJdbcConfiguration(ApplicationContext applicationContext) {
88+
private final JdbcDataProperties properties;
89+
90+
SpringBootJdbcConfiguration(ApplicationContext applicationContext, JdbcDataProperties properties) {
8691
this.applicationContext = applicationContext;
92+
this.properties = properties;
8793
}
8894

8995
@Override
@@ -141,6 +147,10 @@ public DataAccessStrategy dataAccessStrategyBean(NamedParameterJdbcOperations op
141147
@Bean
142148
@ConditionalOnMissingBean
143149
public Dialect jdbcDialect(NamedParameterJdbcOperations operations) {
150+
JdbcDatabaseDialect dialectEnum = this.properties.getDialect();
151+
if (dialectEnum != null) {
152+
return dialectEnum.get();
153+
}
144154
return super.jdbcDialect(operations);
145155
}
146156

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfigurationTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.springframework.data.jdbc.core.convert.DataAccessStrategy;
4141
import org.springframework.data.jdbc.core.convert.JdbcConverter;
4242
import org.springframework.data.jdbc.core.convert.JdbcCustomConversions;
43+
import org.springframework.data.jdbc.core.dialect.JdbcPostgresDialect;
4344
import org.springframework.data.jdbc.core.mapping.JdbcMappingContext;
4445
import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
4546
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
@@ -58,6 +59,7 @@
5859
* @author Andy Wilkinson
5960
* @author Stephane Nicoll
6061
* @author Mark Paluch
62+
* @author Jens Schauder
6163
*/
6264
class JdbcRepositoriesAutoConfigurationTests {
6365

@@ -181,6 +183,16 @@ void allowsUserToDefineCustomDialect() {
181183
allowsUserToDefineCustomBean(DialectConfiguration.class, Dialect.class, "customDialect");
182184
}
183185

186+
@Test
187+
void allowsConfigurationOfDialectByProperty() {
188+
this.contextRunner.with(database())
189+
.withPropertyValues("spring.data.jdbc.dialect=postgresql")
190+
.withConfiguration(AutoConfigurations.of(JdbcTemplateAutoConfiguration.class,
191+
DataSourceTransactionManagerAutoConfiguration.class))
192+
.withUserConfiguration(TestConfiguration.class)
193+
.run((context) -> assertThat(context).hasSingleBean(JdbcPostgresDialect.class));
194+
}
195+
184196
private void allowsUserToDefineCustomBean(Class<?> configuration, Class<?> beanType, String beanName) {
185197
this.contextRunner.with(database())
186198
.withConfiguration(AutoConfigurations.of(JdbcTemplateAutoConfiguration.class,

0 commit comments

Comments
 (0)