Skip to content

Commit 7dba125

Browse files
committed
fix for http://code.google.com/p/mybatis/issues/detail?id=218 . Enable overriding default autoMappingBehavior in ResultMaps
1 parent b13ed76 commit 7dba125

File tree

15 files changed

+271
-12
lines changed

15 files changed

+271
-12
lines changed

src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.apache.ibatis.mapping.SqlSource;
4545
import org.apache.ibatis.mapping.StatementType;
4646
import org.apache.ibatis.reflection.MetaClass;
47+
import org.apache.ibatis.session.AutoMappingBehavior;
4748
import org.apache.ibatis.session.Configuration;
4849
import org.apache.ibatis.type.JdbcType;
4950
import org.apache.ibatis.type.TypeHandler;
@@ -164,11 +165,12 @@ public ResultMap addResultMap(
164165
Class<?> type,
165166
String extend,
166167
Discriminator discriminator,
167-
List<ResultMapping> resultMappings) {
168+
List<ResultMapping> resultMappings,
169+
AutoMappingBehavior autoMappingBehavior) {
168170
id = applyCurrentNamespace(id, false);
169171
extend = applyCurrentNamespace(extend, true);
170172

171-
ResultMap.Builder resultMapBuilder = new ResultMap.Builder(configuration, id, type, resultMappings);
173+
ResultMap.Builder resultMapBuilder = new ResultMap.Builder(configuration, id, type, resultMappings, autoMappingBehavior);
172174
if (extend != null) {
173175
if (!configuration.hasResultMap(extend)) {
174176
throw new IncompleteElementException("Could not find a parent resultmap with id '" + extend + "'");
@@ -358,7 +360,8 @@ private void setStatementResultMap(
358360
configuration,
359361
statementBuilder.id() + "-Inline",
360362
resultType,
361-
new ArrayList<ResultMapping>());
363+
new ArrayList<ResultMapping>(),
364+
null);
362365
resultMaps.add(inlineResultMapBuilder.build());
363366
}
364367
statementBuilder.resultMaps(resultMaps);

src/main/java/org/apache/ibatis/builder/ResultMapResolver.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.apache.ibatis.mapping.Discriminator;
2121
import org.apache.ibatis.mapping.ResultMap;
2222
import org.apache.ibatis.mapping.ResultMapping;
23+
import org.apache.ibatis.session.AutoMappingBehavior;
2324

2425
public class ResultMapResolver {
2526
private final MapperBuilderAssistant assistant;
@@ -28,19 +29,20 @@ public class ResultMapResolver {
2829
private String extend;
2930
private Discriminator discriminator;
3031
private List<ResultMapping> resultMappings;
32+
private AutoMappingBehavior autoMappingBehavior;
3133

32-
public ResultMapResolver(MapperBuilderAssistant assistant, String id, Class<?> type, String extend, Discriminator discriminator,
33-
List<ResultMapping> resultMappings) {
34+
public ResultMapResolver(MapperBuilderAssistant assistant, String id, Class<?> type, String extend, Discriminator discriminator, List<ResultMapping> resultMappings, AutoMappingBehavior autoMappingBehavior) {
3435
this.assistant = assistant;
3536
this.id = id;
3637
this.type = type;
3738
this.extend = extend;
3839
this.discriminator = discriminator;
3940
this.resultMappings = resultMappings;
41+
this.autoMappingBehavior = autoMappingBehavior;
4042
}
4143

4244
public ResultMap resolve() {
43-
return assistant.addResultMap(this.id, this.type, this.extend, this.discriminator, this.resultMappings);
45+
return assistant.addResultMap(this.id, this.type, this.extend, this.discriminator, this.resultMappings, this.autoMappingBehavior);
4446
}
45-
47+
4648
}

src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ private void applyResultMap(String resultMapId, Class<?> returnType, Arg[] args,
182182
applyConstructorArgs(args, returnType, resultMappings);
183183
applyResults(results, returnType, resultMappings);
184184
Discriminator disc = applyDiscriminator(resultMapId, returnType, discriminator);
185-
assistant.addResultMap(resultMapId, returnType, null, disc, resultMappings);
185+
assistant.addResultMap(resultMapId, returnType, null, disc, resultMappings, null); // TODO add AutoMappingBehaviour
186186
createDiscriminatorResultMaps(resultMapId, returnType, discriminator);
187187
}
188188

@@ -193,7 +193,7 @@ private void createDiscriminatorResultMaps(String resultMapId, Class<?> resultTy
193193
List<ResultMapping> resultMappings = new ArrayList<ResultMapping>();
194194
applyConstructorArgs(c.constructArgs(), resultType, resultMappings); // issue #136
195195
applyResults(c.results(), resultType, resultMappings);
196-
assistant.addResultMap(caseResultMapId, c.type(), resultMapId, null, resultMappings);
196+
assistant.addResultMap(caseResultMapId, c.type(), resultMapId, null, resultMappings, null); // TODO add AutoMappingBehaviour
197197
}
198198
}
199199
}

src/main/java/org/apache/ibatis/builder/xml/XMLMapperBuilder.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.apache.ibatis.mapping.ResultMapping;
4343
import org.apache.ibatis.parsing.XNode;
4444
import org.apache.ibatis.parsing.XPathParser;
45+
import org.apache.ibatis.session.AutoMappingBehavior;
4546
import org.apache.ibatis.session.Configuration;
4647
import org.apache.ibatis.type.JdbcType;
4748
import org.apache.ibatis.type.TypeHandler;
@@ -252,6 +253,7 @@ private ResultMap resultMapElement(XNode resultMapNode, List<ResultMapping> addi
252253
resultMapNode.getStringAttribute("resultType",
253254
resultMapNode.getStringAttribute("javaType"))));
254255
String extend = resultMapNode.getStringAttribute("extends");
256+
AutoMappingBehavior autoMappingBehavior = resultMapNode.getEnumAttribute(AutoMappingBehavior.class, "autoMappingBehavior");
255257
Class<?> typeClass = resolveClass(type);
256258
Discriminator discriminator = null;
257259
List<ResultMapping> resultMappings = new ArrayList<ResultMapping>();
@@ -270,7 +272,7 @@ private ResultMap resultMapElement(XNode resultMapNode, List<ResultMapping> addi
270272
resultMappings.add(buildResultMappingFromContext(resultChild, typeClass, flags));
271273
}
272274
}
273-
ResultMapResolver resultMapResolver = new ResultMapResolver(builderAssistant, id, typeClass, extend, discriminator, resultMappings);
275+
ResultMapResolver resultMapResolver = new ResultMapResolver(builderAssistant, id, typeClass, extend, discriminator, resultMappings, autoMappingBehavior);
274276
try {
275277
return resultMapResolver.resolve();
276278
} catch (IncompleteElementException e) {

src/main/java/org/apache/ibatis/builder/xml/mybatis-3-mapper.dtd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ typeHandler CDATA #IMPLIED
5959
id CDATA #REQUIRED
6060
type CDATA #REQUIRED
6161
extends CDATA #IMPLIED
62+
autoMappingBehavior (NONE | PARTIAL | FULL) #IMPLIED
6263
>
6364

6465
<!ELEMENT constructor (idArg*,arg*)>

src/main/java/org/apache/ibatis/executor/resultset/FastResultSetHandler.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ protected Object getRowValue(ResultSet rs, ResultMap resultMap, CacheKey rowKey,
256256
if (resultObject != null && !typeHandlerRegistry.hasTypeHandler(resultMap.getType())) {
257257
final MetaObject metaObject = configuration.newMetaObject(resultObject);
258258
boolean foundValues = resultMap.getConstructorResultMappings().size() > 0;
259-
if (!AutoMappingBehavior.NONE.equals(configuration.getAutoMappingBehavior())) {
259+
if (!AutoMappingBehavior.NONE.equals(getAutoMappingBehavior(resultMap))) {
260260
final List<String> unmappedColumnNames = resultColumnCache.getUnmappedColumnNames(resultMap, null);
261261
foundValues = applyAutomaticMappings(rs, unmappedColumnNames, metaObject, null, resultColumnCache) || foundValues;
262262
}
@@ -269,6 +269,11 @@ protected Object getRowValue(ResultSet rs, ResultMap resultMap, CacheKey rowKey,
269269
return resultObject;
270270
}
271271

272+
protected AutoMappingBehavior getAutoMappingBehavior(ResultMap resultMap) {
273+
if (resultMap.getAutoMappingBehavior() != null) return resultMap.getAutoMappingBehavior();
274+
return configuration.getAutoMappingBehavior();
275+
}
276+
272277
protected ResultLoaderMap instantiateResultLoaderMap() {
273278
if (configuration.isLazyLoadingEnabled()) {
274279
return new ResultLoaderMap();

src/main/java/org/apache/ibatis/executor/resultset/NestedResultSetHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ protected Object getRowValue(ResultSet rs, ResultMap resultMap, CacheKey combine
140140
if (rowKey != CacheKey.NULL_CACHE_KEY) ancestorCache.put(rowKey, resultObject);
141141
final MetaObject metaObject = configuration.newMetaObject(resultObject);
142142
boolean foundValues = resultMap.getConstructorResultMappings().size() > 0;
143-
if (AutoMappingBehavior.FULL.equals(configuration.getAutoMappingBehavior())) {
143+
if (AutoMappingBehavior.FULL.equals(getAutoMappingBehavior(resultMap))) {
144144
final List<String> unmappedColumnNames = resultColumnCache.getUnmappedColumnNames(resultMap, columnPrefix);
145145
foundValues = applyAutomaticMappings(rs, unmappedColumnNames, metaObject, columnPrefix, resultColumnCache) || foundValues;
146146
}

src/main/java/org/apache/ibatis/mapping/ResultMap.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.apache.ibatis.mapping;
1717

18+
import org.apache.ibatis.session.AutoMappingBehavior;
1819
import org.apache.ibatis.session.Configuration;
1920

2021
import java.util.*;
@@ -30,6 +31,7 @@ public class ResultMap {
3031
private Discriminator discriminator;
3132
private boolean hasNestedResultMaps;
3233
private boolean hasNestedQueries;
34+
private AutoMappingBehavior autoMappingBehavior;
3335

3436
private ResultMap() {
3537
}
@@ -38,9 +40,14 @@ public static class Builder {
3840
private ResultMap resultMap = new ResultMap();
3941

4042
public Builder(Configuration configuration, String id, Class<?> type, List<ResultMapping> resultMappings) {
43+
this(configuration, id, type, resultMappings, null);
44+
}
45+
46+
public Builder(Configuration configuration, String id, Class<?> type, List<ResultMapping> resultMappings, AutoMappingBehavior autoMappingBehavior) {
4147
resultMap.id = id;
4248
resultMap.type = type;
4349
resultMap.resultMappings = resultMappings;
50+
resultMap.autoMappingBehavior = autoMappingBehavior;
4451
}
4552

4653
public Builder discriminator(Discriminator discriminator) {
@@ -139,5 +146,9 @@ public Discriminator getDiscriminator() {
139146
public void forceNestedResultMaps() {
140147
hasNestedResultMaps = true;
141148
}
149+
150+
public AutoMappingBehavior getAutoMappingBehavior() {
151+
return autoMappingBehavior;
152+
}
142153

143154
}

src/main/java/org/apache/ibatis/parsing/XNode.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,19 @@ public Float getFloatBody(Float def) {
189189
}
190190
}
191191

192+
public <T extends Enum<T>> T getEnumAttribute(Class<T> enumType, String name) {
193+
return getEnumAttribute(enumType, name, null);
194+
}
195+
196+
public <T extends Enum<T>> T getEnumAttribute(Class<T> enumType, String name, T def) {
197+
String value = getStringAttribute(name);
198+
if (value == null) {
199+
return def;
200+
} else {
201+
return Enum.valueOf(enumType, value);
202+
}
203+
}
204+
192205
public String getStringAttribute(String name) {
193206
return getStringAttribute(name, null);
194207
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* Copyright 2009-2012 The MyBatis Team
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+
* http://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+
package org.apache.ibatis.submitted.automapping;
17+
18+
import java.io.Reader;
19+
import java.sql.Connection;
20+
21+
import org.apache.ibatis.io.Resources;
22+
import org.apache.ibatis.jdbc.ScriptRunner;
23+
import org.apache.ibatis.session.SqlSession;
24+
import org.apache.ibatis.session.SqlSessionFactory;
25+
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
26+
import org.junit.Assert;
27+
import org.junit.BeforeClass;
28+
import org.junit.Test;
29+
30+
public class BaseTest {
31+
32+
private static SqlSessionFactory sqlSessionFactory;
33+
34+
@BeforeClass
35+
public static void setUp() throws Exception {
36+
// create a SqlSessionFactory
37+
Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/automapping/mybatis-config.xml");
38+
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
39+
reader.close();
40+
41+
// populate in-memory database
42+
SqlSession session = sqlSessionFactory.openSession();
43+
Connection conn = session.getConnection();
44+
reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/automapping/CreateDB.sql");
45+
ScriptRunner runner = new ScriptRunner(conn);
46+
runner.setLogWriter(null);
47+
runner.runScript(reader);
48+
reader.close();
49+
session.close();
50+
}
51+
52+
@Test
53+
public void shouldGetAUser() {
54+
SqlSession sqlSession = sqlSessionFactory.openSession();
55+
try {
56+
Mapper mapper = sqlSession.getMapper(Mapper.class);
57+
User user = mapper.getUser(1);
58+
Assert.assertEquals("User1", user.getName());
59+
} finally {
60+
sqlSession.close();
61+
}
62+
}
63+
64+
}

0 commit comments

Comments
 (0)