1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.guice.configuration;
17
18 import com.google.inject.ProvisionException;
19
20 import jakarta.inject.Named;
21 import jakarta.inject.Provider;
22 import jakarta.inject.Singleton;
23
24 import java.util.HashSet;
25 import java.util.Set;
26
27 import javax.sql.DataSource;
28
29 import org.apache.ibatis.executor.ErrorContext;
30 import org.apache.ibatis.mapping.DatabaseIdProvider;
31 import org.apache.ibatis.mapping.Environment;
32 import org.apache.ibatis.session.AutoMappingBehavior;
33 import org.apache.ibatis.session.Configuration;
34 import org.apache.ibatis.session.ExecutorType;
35 import org.mybatis.guice.configuration.settings.ConfigurationSetting;
36 import org.mybatis.guice.configuration.settings.MapperConfigurationSetting;
37
38 import edu.umd.cs.findbugs.annotations.Nullable;
39
40
41
42
43 @Singleton
44 public class ConfigurationProvider implements Provider<Configuration>, ConfigurationSettingListener {
45
46
47
48
49 private final Environment environment;
50
51 @com.google.inject.Inject(optional = true)
52 @Named("mybatis.configuration.lazyLoadingEnabled")
53 private boolean lazyLoadingEnabled = false;
54
55 @com.google.inject.Inject(optional = true)
56 @Named("mybatis.configuration.aggressiveLazyLoading")
57 private boolean aggressiveLazyLoading = true;
58
59 @com.google.inject.Inject(optional = true)
60 @Named("mybatis.configuration.multipleResultSetsEnabled")
61 private boolean multipleResultSetsEnabled = true;
62
63 @com.google.inject.Inject(optional = true)
64 @Named("mybatis.configuration.useGeneratedKeys")
65 private boolean useGeneratedKeys = false;
66
67 @com.google.inject.Inject(optional = true)
68 @Named("mybatis.configuration.useColumnLabel")
69 private boolean useColumnLabel = true;
70
71 @com.google.inject.Inject(optional = true)
72 @Named("mybatis.configuration.cacheEnabled")
73 private boolean cacheEnabled = true;
74
75 @com.google.inject.Inject(optional = true)
76 @Named("mybatis.configuration.defaultExecutorType")
77 private ExecutorType defaultExecutorType = ExecutorType.SIMPLE;
78
79 @com.google.inject.Inject(optional = true)
80 @Named("mybatis.configuration.autoMappingBehavior")
81 private AutoMappingBehavior autoMappingBehavior = AutoMappingBehavior.PARTIAL;
82
83 @com.google.inject.Inject(optional = true)
84 @Named("mybatis.configuration.callSettersOnNulls")
85 private boolean callSettersOnNulls = false;
86
87 @com.google.inject.Inject(optional = true)
88 @Named("mybatis.configuration.defaultStatementTimeout")
89 @Nullable
90 private Integer defaultStatementTimeout;
91
92 @com.google.inject.Inject(optional = true)
93 @Named("mybatis.configuration.mapUnderscoreToCamelCase")
94 private boolean mapUnderscoreToCamelCase = false;
95
96 @com.google.inject.Inject(optional = true)
97 @Named("mybatis.configuration.failFast")
98 private boolean failFast = false;
99
100 @com.google.inject.Inject(optional = true)
101 private DatabaseIdProvider databaseIdProvider;
102
103 @com.google.inject.Inject
104 private DataSource dataSource;
105
106 private Set<ConfigurationSetting> configurationSettings = new HashSet<>();
107 private Set<MapperConfigurationSetting> mapperConfigurationSettings = new HashSet<>();
108
109
110
111
112
113
114
115
116
117 @com.google.inject.Inject
118 public ConfigurationProvider(final Environment environment) {
119 this.environment = environment;
120 }
121
122 @Deprecated
123 public void setEnvironment(Environment environment) {
124
125 }
126
127
128
129
130
131
132
133
134
135 public void setFailFast(boolean failFast) {
136 this.failFast = failFast;
137 }
138
139 @Override
140 public void addConfigurationSetting(ConfigurationSetting configurationSetting) {
141 this.configurationSettings.add(configurationSetting);
142 }
143
144 @Override
145 public void addMapperConfigurationSetting(MapperConfigurationSetting mapperConfigurationSetting) {
146 this.mapperConfigurationSettings.add(mapperConfigurationSetting);
147 }
148
149
150
151
152
153
154
155
156
157 protected Configuration newConfiguration(Environment environment) {
158 return new Configuration(environment);
159 }
160
161 @Override
162 public Configuration get() {
163 final Configuration configuration = newConfiguration(environment);
164 configuration.setLazyLoadingEnabled(lazyLoadingEnabled);
165 configuration.setAggressiveLazyLoading(aggressiveLazyLoading);
166 configuration.setMultipleResultSetsEnabled(multipleResultSetsEnabled);
167 configuration.setUseGeneratedKeys(useGeneratedKeys);
168 configuration.setUseColumnLabel(useColumnLabel);
169 configuration.setCacheEnabled(cacheEnabled);
170 configuration.setDefaultExecutorType(defaultExecutorType);
171 configuration.setAutoMappingBehavior(autoMappingBehavior);
172 configuration.setCallSettersOnNulls(callSettersOnNulls);
173 configuration.setDefaultStatementTimeout(defaultStatementTimeout);
174 configuration.setMapUnderscoreToCamelCase(mapUnderscoreToCamelCase);
175
176 for (ConfigurationSetting setting : configurationSettings) {
177 setting.applyConfigurationSetting(configuration);
178 }
179
180 try {
181 if (databaseIdProvider != null) {
182 configuration.setDatabaseId(databaseIdProvider.getDatabaseId(dataSource));
183 }
184
185 for (MapperConfigurationSetting setting : mapperConfigurationSettings) {
186 setting.applyConfigurationSetting(configuration);
187 }
188
189 if (failFast) {
190 configuration.getMappedStatementNames();
191 }
192 } catch (Throwable cause) {
193 throw new ProvisionException("An error occurred while building the org.apache.ibatis.session.Configuration",
194 cause);
195 } finally {
196 ErrorContext.instance().reset();
197 }
198
199 return configuration;
200 }
201 }