Skip to content

Commit 14f1c7e

Browse files
committed
Improve Dialect configuration
1 parent 6bb1820 commit 14f1c7e

File tree

3 files changed

+127
-50
lines changed

3 files changed

+127
-50
lines changed

doma-spring-boot-autoconfigure/src/main/java/org/seasar/doma/boot/autoconfigure/DomaAutoConfiguration.java

Lines changed: 58 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616
package org.seasar.doma.boot.autoconfigure;
1717

1818
import javax.sql.DataSource;
19+
1920
import org.seasar.doma.boot.DomaPersistenceExceptionTranslator;
2021
import org.seasar.doma.boot.TryLookupEntityListenerProvider;
22+
import org.seasar.doma.boot.autoconfigure.DomaProperties.DialectType;
2123
import org.seasar.doma.boot.event.DomaEventEntityListener;
2224
import org.seasar.doma.boot.event.DomaEventListenerFactory;
2325
import org.seasar.doma.jdbc.Config;
@@ -26,16 +28,27 @@
2628
import org.seasar.doma.jdbc.SqlFileRepository;
2729
import org.seasar.doma.jdbc.criteria.Entityql;
2830
import org.seasar.doma.jdbc.criteria.NativeSql;
31+
import org.seasar.doma.jdbc.dialect.Db2Dialect;
2932
import org.seasar.doma.jdbc.dialect.Dialect;
33+
import org.seasar.doma.jdbc.dialect.H2Dialect;
34+
import org.seasar.doma.jdbc.dialect.HsqldbDialect;
35+
import org.seasar.doma.jdbc.dialect.MssqlDialect;
36+
import org.seasar.doma.jdbc.dialect.MysqlDialect;
37+
import org.seasar.doma.jdbc.dialect.OracleDialect;
38+
import org.seasar.doma.jdbc.dialect.PostgresDialect;
39+
import org.seasar.doma.jdbc.dialect.SqliteDialect;
40+
import org.seasar.doma.jdbc.dialect.StandardDialect;
3041
import org.springframework.beans.factory.annotation.Autowired;
3142
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
3243
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3344
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3445
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3546
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
3647
import org.springframework.boot.context.properties.EnableConfigurationProperties;
48+
import org.springframework.boot.jdbc.DatabaseDriver;
3749
import org.springframework.context.annotation.Bean;
3850
import org.springframework.context.annotation.Configuration;
51+
import org.springframework.core.env.Environment;
3952
import org.springframework.dao.support.PersistenceExceptionTranslator;
4053
import org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator;
4154

@@ -56,8 +69,37 @@ public class DomaAutoConfiguration {
5669

5770
@Bean
5871
@ConditionalOnMissingBean
59-
public Dialect dialect() {
60-
return domaProperties.getDialect().create();
72+
public Dialect dialect(Environment environment) {
73+
DialectType dialectType = domaProperties.getDialect();
74+
if (dialectType != null) {
75+
return dialectType.create();
76+
}
77+
String url = environment.getProperty("spring.datasource.url");
78+
if (url != null) {
79+
DatabaseDriver databaseDriver = DatabaseDriver.fromJdbcUrl(url);
80+
switch (databaseDriver) {
81+
case DB2:
82+
return new Db2Dialect();
83+
case H2:
84+
return new H2Dialect();
85+
case HSQLDB:
86+
return new HsqldbDialect();
87+
case SQLSERVER:
88+
case JTDS:
89+
return new MssqlDialect();
90+
case MYSQL:
91+
return new MysqlDialect();
92+
case ORACLE:
93+
return new OracleDialect();
94+
case POSTGRESQL:
95+
return new PostgresDialect();
96+
case SQLITE:
97+
return new SqliteDialect();
98+
default:
99+
break;
100+
}
101+
}
102+
return new StandardDialect();
61103
}
62104

63105
@Bean
@@ -128,20 +170,20 @@ public DomaConfig config(DataSource dataSource, Dialect dialect,
128170
return domaConfigBuilder.build();
129171
}
130172

131-
@Configuration
132-
@ConditionalOnClass({ Entityql.class, NativeSql.class })
133-
public static class CriteriaConfiguration {
173+
@Configuration
174+
@ConditionalOnClass({ Entityql.class, NativeSql.class })
175+
public static class CriteriaConfiguration {
134176

135-
@Bean
136-
@ConditionalOnMissingBean(Entityql.class)
137-
public Entityql entityql(Config config) {
138-
return new Entityql(config);
139-
}
177+
@Bean
178+
@ConditionalOnMissingBean(Entityql.class)
179+
public Entityql entityql(Config config) {
180+
return new Entityql(config);
181+
}
140182

141-
@Bean
142-
@ConditionalOnMissingBean(NativeSql.class)
143-
public NativeSql nativeSql(Config config) {
144-
return new NativeSql(config);
145-
}
146-
}
183+
@Bean
184+
@ConditionalOnMissingBean(NativeSql.class)
185+
public NativeSql nativeSql(Config config) {
186+
return new NativeSql(config);
187+
}
188+
}
147189
}

doma-spring-boot-autoconfigure/src/main/java/org/seasar/doma/boot/autoconfigure/DomaProperties.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class DomaProperties {
3535
/**
3636
* Dialect of database used by Doma.
3737
*/
38-
private DialectType dialect = DialectType.STANDARD;
38+
private DialectType dialect;
3939

4040
/**
4141
* Type of {@link SqlFileRepository}.

doma-spring-boot-autoconfigure/src/test/java/org/seasar/doma/boot/autoconfigure/DomaAutoConfigurationTest.java

Lines changed: 68 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.sql.SQLException;
2222
import java.sql.SQLTimeoutException;
2323
import java.util.Collections;
24+
import java.util.HashMap;
2425
import java.util.Map;
2526

2627
import javax.sql.DataSource;
@@ -29,10 +30,18 @@
2930
import org.junit.Before;
3031
import org.junit.Test;
3132
import org.seasar.doma.boot.DomaPersistenceExceptionTranslator;
32-
import org.seasar.doma.jdbc.*;
33+
import org.seasar.doma.jdbc.Config;
34+
import org.seasar.doma.jdbc.EntityListenerProvider;
35+
import org.seasar.doma.jdbc.GreedyCacheSqlFileRepository;
36+
import org.seasar.doma.jdbc.JdbcException;
37+
import org.seasar.doma.jdbc.Naming;
38+
import org.seasar.doma.jdbc.NoCacheSqlFileRepository;
39+
import org.seasar.doma.jdbc.SqlFileRepository;
40+
import org.seasar.doma.jdbc.UtilLoggingJdbcLogger;
3341
import org.seasar.doma.jdbc.criteria.Entityql;
3442
import org.seasar.doma.jdbc.criteria.NativeSql;
3543
import org.seasar.doma.jdbc.dialect.Dialect;
44+
import org.seasar.doma.jdbc.dialect.H2Dialect;
3645
import org.seasar.doma.jdbc.dialect.MysqlDialect;
3746
import org.seasar.doma.jdbc.dialect.PostgresDialect;
3847
import org.seasar.doma.jdbc.dialect.StandardDialect;
@@ -197,28 +206,54 @@ public void testSQLExceptionTranslator() {
197206
}
198207
}
199208

200-
@Test
201-
public void testAutoRegisteredCriteriaAPI() {
202-
this.context.register(DomaAutoConfiguration.class, DataSourceAutoConfiguration.class);
203-
this.context.refresh();
204-
Entityql entityql = this.context.getBean(Entityql.class);
205-
assertNotNull(entityql);
206-
NativeSql nativeSql = this.context.getBean(NativeSql.class);
207-
assertNotNull(nativeSql);
208-
}
209+
@Test
210+
public void testAutoRegisteredCriteriaAPI() {
211+
this.context.register(DomaAutoConfiguration.class, DataSourceAutoConfiguration.class);
212+
this.context.refresh();
213+
Entityql entityql = this.context.getBean(Entityql.class);
214+
assertNotNull(entityql);
215+
NativeSql nativeSql = this.context.getBean(NativeSql.class);
216+
assertNotNull(nativeSql);
217+
}
218+
219+
@Test
220+
public void testCriteriaAPIWithConfig() {
221+
this.context.register(MyCriteriaAPIConfig.class, DomaAutoConfiguration.class,
222+
DataSourceAutoConfiguration.class);
223+
this.context.refresh();
224+
Map<String, Entityql> entityqlBeans = this.context.getBeansOfType(Entityql.class);
225+
assertEquals(1, entityqlBeans.size());
226+
assertNotNull(entityqlBeans.get("myEntityql"));
227+
Map<String, NativeSql> nativeSqlBeans = this.context.getBeansOfType(NativeSql.class);
228+
assertEquals(1, nativeSqlBeans.size());
229+
assertNotNull(nativeSqlBeans.get("myNativeSql"));
230+
}
209231

210-
@Test
211-
public void testCriteriaAPIWithConfig() {
212-
this.context.register(MyCriteriaAPIConfig.class, DomaAutoConfiguration.class,
213-
DataSourceAutoConfiguration.class);
214-
this.context.refresh();
215-
Map<String, Entityql> entityqlBeans = this.context.getBeansOfType(Entityql.class);
216-
assertEquals(1, entityqlBeans.size());
217-
assertNotNull(entityqlBeans.get("myEntityql"));
218-
Map<String, NativeSql> nativeSqlBeans = this.context.getBeansOfType(NativeSql.class);
219-
assertEquals(1, nativeSqlBeans.size());
220-
assertNotNull(nativeSqlBeans.get("myNativeSql"));
221-
}
232+
@Test
233+
public void testDialectByDataSourceUrl() {
234+
MutablePropertySources sources = context.getEnvironment()
235+
.getPropertySources();
236+
sources.addFirst(new MapPropertySource("test",
237+
Collections.singletonMap("spring.datasource.url", "jdbc:h2:mem:example")));
238+
this.context.register(DomaAutoConfiguration.class, DataSourceAutoConfiguration.class);
239+
this.context.refresh();
240+
Dialect dialect = this.context.getBean(Dialect.class);
241+
assertThat(dialect, is(instanceOf(H2Dialect.class)));
242+
}
243+
244+
@Test
245+
public void testDialectByDomaPropertiesIgnoreDataSourceUrl() {
246+
MutablePropertySources sources = context.getEnvironment()
247+
.getPropertySources();
248+
Map<String, Object> source = new HashMap<>();
249+
source.put("spring.datasource.url", "jdbc:h2:mem:example");
250+
source.put("doma.dialect", "POSTGRES");
251+
sources.addFirst(new MapPropertySource("test", source));
252+
this.context.register(DomaAutoConfiguration.class, DataSourceAutoConfiguration.class);
253+
this.context.refresh();
254+
Dialect dialect = this.context.getBean(Dialect.class);
255+
assertThat(dialect, is(instanceOf(PostgresDialect.class)));
256+
}
222257

223258
@After
224259
public void tearDown() {
@@ -287,17 +322,17 @@ public static void addEnvironment(ConfigurableApplicationContext context,
287322
}
288323
}
289324

290-
@Configuration
291-
public static class MyCriteriaAPIConfig {
325+
@Configuration
326+
public static class MyCriteriaAPIConfig {
292327

293-
@Bean
294-
public Entityql myEntityql(Config config) {
295-
return new Entityql(config);
296-
}
328+
@Bean
329+
public Entityql myEntityql(Config config) {
330+
return new Entityql(config);
331+
}
297332

298-
@Bean
299-
public NativeSql myNativeSql(Config config) {
300-
return new NativeSql(config);
301-
}
302-
}
333+
@Bean
334+
public NativeSql myNativeSql(Config config) {
335+
return new NativeSql(config);
336+
}
337+
}
303338
}

0 commit comments

Comments
 (0)