From 7788d4c1026ea95989fa1433a2d47bab9c8634bc Mon Sep 17 00:00:00 2001 From: min1854 <1042039351@qq.com> Date: Sat, 8 Apr 2023 20:53:05 +0800 Subject: [PATCH 1/3] implement MapValue function --- .../apache/ibatis/annotations/MapValue.java | 27 ++++++++++++ .../apache/ibatis/binding/MapperMethod.java | 25 ++++++++++- .../result/DefaultMapResultHandler.java | 6 ++- .../org/apache/ibatis/session/SqlSession.java | 42 +++++++++++++++++++ .../ibatis/session/SqlSessionManager.java | 8 ++++ .../session/defaults/DefaultSqlSession.java | 12 +++++- 6 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/apache/ibatis/annotations/MapValue.java diff --git a/src/main/java/org/apache/ibatis/annotations/MapValue.java b/src/main/java/org/apache/ibatis/annotations/MapValue.java new file mode 100644 index 00000000000..a41717c6646 --- /dev/null +++ b/src/main/java/org/apache/ibatis/annotations/MapValue.java @@ -0,0 +1,27 @@ +/* + * Copyright 2009-2023 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 + * + * https://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.apache.ibatis.annotations; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface MapValue { + + String value(); + +} diff --git a/src/main/java/org/apache/ibatis/binding/MapperMethod.java b/src/main/java/org/apache/ibatis/binding/MapperMethod.java index c822a4e3ec4..ba1f431fd61 100644 --- a/src/main/java/org/apache/ibatis/binding/MapperMethod.java +++ b/src/main/java/org/apache/ibatis/binding/MapperMethod.java @@ -26,6 +26,7 @@ import org.apache.ibatis.annotations.Flush; import org.apache.ibatis.annotations.MapKey; +import org.apache.ibatis.annotations.MapValue; import org.apache.ibatis.cursor.Cursor; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.SqlCommandType; @@ -193,9 +194,9 @@ private Map executeForMap(SqlSession sqlSession, Object[] args) { Object param = method.convertArgsToSqlCommandParam(args); if (method.hasRowBounds()) { RowBounds rowBounds = method.extractRowBounds(args); - result = sqlSession.selectMap(command.getName(), param, method.getMapKey(), rowBounds); + result = sqlSession.selectMap(command.getName(), param, method.getMapKey(), method.getMapValue(), rowBounds); } else { - result = sqlSession.selectMap(command.getName(), param, method.getMapKey()); + result = sqlSession.selectMap(command.getName(), param, method.getMapKey(), method.getMapValue()); } return result; } @@ -277,6 +278,7 @@ public static class MethodSignature { private final boolean returnsOptional; private final Class returnType; private final String mapKey; + private final String mapValue; private final Integer resultHandlerIndex; private final Integer rowBoundsIndex; private final ParamNameResolver paramNameResolver; @@ -295,6 +297,7 @@ public MethodSignature(Configuration configuration, Class mapperInterface, Me this.returnsCursor = Cursor.class.equals(this.returnType); this.returnsOptional = Optional.class.equals(this.returnType); this.mapKey = getMapKey(method); + this.mapValue = getMapValue(method); this.returnsMap = this.mapKey != null; this.rowBoundsIndex = getUniqueParamIndex(method, RowBounds.class); this.resultHandlerIndex = getUniqueParamIndex(method, ResultHandler.class); @@ -371,6 +374,11 @@ public String getMapKey() { return mapKey; } + + public String getMapValue() { + return mapValue; + } + private String getMapKey(Method method) { String mapKey = null; if (Map.class.isAssignableFrom(method.getReturnType())) { @@ -381,6 +389,19 @@ private String getMapKey(Method method) { } return mapKey; } + + private String getMapValue(Method method) { + String mapValue = null; + if (Map.class.isAssignableFrom(method.getReturnType())) { + final MapValue annotation = method.getAnnotation(MapValue.class); + if (annotation != null) { + mapValue = annotation.value(); + } + } + return mapValue; + } + } + } diff --git a/src/main/java/org/apache/ibatis/executor/result/DefaultMapResultHandler.java b/src/main/java/org/apache/ibatis/executor/result/DefaultMapResultHandler.java index f2ee92bcc02..938340dc47c 100644 --- a/src/main/java/org/apache/ibatis/executor/result/DefaultMapResultHandler.java +++ b/src/main/java/org/apache/ibatis/executor/result/DefaultMapResultHandler.java @@ -31,18 +31,20 @@ public class DefaultMapResultHandler implements ResultHandler { private final Map mappedResults; private final String mapKey; + private final String mapValue; private final ObjectFactory objectFactory; private final ObjectWrapperFactory objectWrapperFactory; private final ReflectorFactory reflectorFactory; @SuppressWarnings("unchecked") - public DefaultMapResultHandler(String mapKey, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, + public DefaultMapResultHandler(String mapKey, String mapValue, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) { this.objectFactory = objectFactory; this.objectWrapperFactory = objectWrapperFactory; this.reflectorFactory = reflectorFactory; this.mappedResults = objectFactory.create(Map.class); this.mapKey = mapKey; + this.mapValue = mapValue; } @Override @@ -51,7 +53,7 @@ public void handleResult(ResultContext context) { final MetaObject mo = MetaObject.forObject(value, objectFactory, objectWrapperFactory, reflectorFactory); // TODO is that assignment always true? final K key = (K) mo.getValue(mapKey); - mappedResults.put(key, value); + mappedResults.put(key, ((V) (mapValue == null ? value : mo.getValue(mapValue)))); } public Map getMappedResults() { diff --git a/src/main/java/org/apache/ibatis/session/SqlSession.java b/src/main/java/org/apache/ibatis/session/SqlSession.java index bb0f85932dc..3e6da36aee5 100644 --- a/src/main/java/org/apache/ibatis/session/SqlSession.java +++ b/src/main/java/org/apache/ibatis/session/SqlSession.java @@ -156,6 +156,48 @@ public interface SqlSession extends Closeable { */ Map selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds); + /** + * The selectMap is a special case in that it is designed to convert a list of results into a Map based on one of the + * properties in the resulting objects. + * + * @param + * the returned Map keys type + * @param + * the returned Map values type + * @param statement + * Unique identifier matching the statement to use. + * @param parameter + * A parameter object to pass to the statement. + * @param mapKey + * The property to use as key for each value in the list. + * @param mapValue + * The property to use as value for each value in the list. + * @return Map containing key pair data. + */ + Map selectMap(String statement, Object parameter, String mapKey, String mapValue); + + /** + * The selectMap is a special case in that it is designed to convert a list of results into a Map based on one of the + * properties in the resulting objects. + * + * @param + * the returned Map keys type + * @param + * the returned Map values type + * @param statement + * Unique identifier matching the statement to use. + * @param parameter + * A parameter object to pass to the statement. + * @param mapKey + * The property to use as key for each value in the list. + * @param mapValue + * The property to use as value for each value in the list. + * @param rowBounds + * Bounds to limit object retrieval + * @return Map containing key pair data. + */ + Map selectMap(String statement, Object parameter, String mapKey, String mapValue, RowBounds rowBounds); + /** * A Cursor offers the same results as a List, except it fetches data lazily using an Iterator. * diff --git a/src/main/java/org/apache/ibatis/session/SqlSessionManager.java b/src/main/java/org/apache/ibatis/session/SqlSessionManager.java index 183aa878f9c..bf4c281433b 100644 --- a/src/main/java/org/apache/ibatis/session/SqlSessionManager.java +++ b/src/main/java/org/apache/ibatis/session/SqlSessionManager.java @@ -179,6 +179,14 @@ public Map selectMap(String statement, Object parameter, String map return sqlSessionProxy.selectMap(statement, parameter, mapKey, rowBounds); } + public Map selectMap(String statement, Object parameter, String mapKey, String mapValue) { + return sqlSessionProxy.selectMap(statement, parameter, mapKey, mapValue); + } + @Override + public Map selectMap(String statement, Object parameter, String mapKey, String mapValue, RowBounds rowBounds) { + return sqlSessionProxy.selectMap(statement, parameter, mapKey, rowBounds); + } + @Override public Cursor selectCursor(String statement) { return sqlSessionProxy.selectCursor(statement); diff --git a/src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession.java b/src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession.java index 62b39becea5..21472ece96a 100644 --- a/src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession.java +++ b/src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession.java @@ -96,8 +96,18 @@ public Map selectMap(String statement, Object parameter, String map @Override public Map selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds) { + return this.selectMap(statement, parameter, mapKey, null, rowBounds); + } + + @Override + public Map selectMap(String statement, Object parameter, String mapKey, String mapValue) { + return this.selectMap(statement, parameter, mapKey, mapValue, RowBounds.DEFAULT); + } + + @Override + public Map selectMap(String statement, Object parameter, String mapKey, String mapValue, RowBounds rowBounds) { final List list = selectList(statement, parameter, rowBounds); - final DefaultMapResultHandler mapResultHandler = new DefaultMapResultHandler<>(mapKey, + final DefaultMapResultHandler mapResultHandler = new DefaultMapResultHandler<>(mapKey, mapValue, configuration.getObjectFactory(), configuration.getObjectWrapperFactory(), configuration.getReflectorFactory()); final DefaultResultContext context = new DefaultResultContext<>(); for (V o : list) { From f2b1a69c4dbe4f76e54b73624182c16a13ce3cce Mon Sep 17 00:00:00 2001 From: min1854 <1042039351@qq.com> Date: Sat, 8 Apr 2023 20:53:52 +0800 Subject: [PATCH 2/3] assert MapValue function --- .../apache/ibatis/session/SqlSessionTest.java | 16 ++++++++ .../submitted/mapkey_value/NoticeMapper.java | 13 +++++++ .../apache/ibatis/builder/MapperConfig.xml | 1 + .../apache/ibatis/builder/NoticeMapper.xml | 38 +++++++++++++++++++ .../databases/blog/blog-derby-dataload.sql | 10 ++++- .../databases/blog/blog-derby-schema.sql | 6 +++ 6 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 src/test/java/org/apache/ibatis/submitted/mapkey_value/NoticeMapper.java create mode 100644 src/test/resources/org/apache/ibatis/builder/NoticeMapper.xml diff --git a/src/test/java/org/apache/ibatis/session/SqlSessionTest.java b/src/test/java/org/apache/ibatis/session/SqlSessionTest.java index 0b72e1d385e..d6e6f9a14a3 100644 --- a/src/test/java/org/apache/ibatis/session/SqlSessionTest.java +++ b/src/test/java/org/apache/ibatis/session/SqlSessionTest.java @@ -28,6 +28,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.function.Consumer; import javassist.util.proxy.Proxy; @@ -53,6 +54,7 @@ import org.apache.ibatis.mapping.SqlCommandType; import org.apache.ibatis.mapping.SqlSource; import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory; +import org.apache.ibatis.submitted.mapkey_value.NoticeMapper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -180,6 +182,20 @@ void shouldSelectAllAuthorsAsMap() { } } + @Test + public void shouldGroupStatusAsMap() { + try ( + SqlSession sqlSession = sqlMapper.openSession() + ) { + NoticeMapper mapper = sqlSession.getMapper(NoticeMapper.class); + Map statusCount = mapper.groupStatus(); + assertEquals(2, statusCount.size()); + assertEquals(statusCount.get(1), 3); + assertEquals(statusCount.get(2), 4); + + } + } + @Test void shouldSelectCountOfPosts() { try (SqlSession session = sqlMapper.openSession()) { diff --git a/src/test/java/org/apache/ibatis/submitted/mapkey_value/NoticeMapper.java b/src/test/java/org/apache/ibatis/submitted/mapkey_value/NoticeMapper.java new file mode 100644 index 00000000000..1d73302faf5 --- /dev/null +++ b/src/test/java/org/apache/ibatis/submitted/mapkey_value/NoticeMapper.java @@ -0,0 +1,13 @@ +package org.apache.ibatis.submitted.mapkey_value; + +import org.apache.ibatis.annotations.MapKey; +import org.apache.ibatis.annotations.MapValue; + +import java.util.Map; + +public interface NoticeMapper { + + @MapKey("status") + @MapValue("count") + Map groupStatus(); +} diff --git a/src/test/resources/org/apache/ibatis/builder/MapperConfig.xml b/src/test/resources/org/apache/ibatis/builder/MapperConfig.xml index 52de5ab336d..9ce22d85e76 100644 --- a/src/test/resources/org/apache/ibatis/builder/MapperConfig.xml +++ b/src/test/resources/org/apache/ibatis/builder/MapperConfig.xml @@ -77,6 +77,7 @@ + diff --git a/src/test/resources/org/apache/ibatis/builder/NoticeMapper.xml b/src/test/resources/org/apache/ibatis/builder/NoticeMapper.xml new file mode 100644 index 00000000000..1ba55c34dd2 --- /dev/null +++ b/src/test/resources/org/apache/ibatis/builder/NoticeMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/org/apache/ibatis/databases/blog/blog-derby-dataload.sql b/src/test/resources/org/apache/ibatis/databases/blog/blog-derby-dataload.sql index 94f92331c32..51ee29b4bd8 100644 --- a/src/test/resources/org/apache/ibatis/databases/blog/blog-derby-dataload.sql +++ b/src/test/resources/org/apache/ibatis/databases/blog/blog-derby-dataload.sql @@ -49,10 +49,18 @@ INSERT INTO comment (id,post_id,name,comment) VALUES (3,3,'rider','I prefer moto -- 4 5 6 7 INSERT INTO node (id, parent_id) VALUES (1,null); -INSERT INTO node (id, parent_id) VALUES (2,1); +INSERT INTO node (id, parent_id) VALUES (2,1); INSERT INTO node (id, parent_id) VALUES (3,1); INSERT INTO node (id, parent_id) VALUES (4,2); INSERT INTO node (id, parent_id) VALUES (5,2); INSERT INTO node (id, parent_id) VALUES (6,3); INSERT INTO node (id, parent_id) VALUES (7,3); + +INSERT INTO notice (id, status) VALUES (1,1); +INSERT INTO notice (id, status) VALUES (2,2); +INSERT INTO notice (id, status) VALUES (3,1); +INSERT INTO notice (id, status) VALUES (4,2); +INSERT INTO notice (id, status) VALUES (5,1); +INSERT INTO notice (id, status) VALUES (6,2); +INSERT INTO notice (id, status) VALUES (7,2); diff --git a/src/test/resources/org/apache/ibatis/databases/blog/blog-derby-schema.sql b/src/test/resources/org/apache/ibatis/databases/blog/blog-derby-schema.sql index e4304d1ab6c..284822ae077 100644 --- a/src/test/resources/org/apache/ibatis/databases/blog/blog-derby-schema.sql +++ b/src/test/resources/org/apache/ibatis/databases/blog/blog-derby-schema.sql @@ -80,6 +80,12 @@ parent_id INT, PRIMARY KEY(id) ); +CREATE TABLE notice ( +id INT NOT NULL, +status INT NOT NULL, +PRIMARY KEY(id) +); + CREATE PROCEDURE selectTwoSetsOfAuthors(DP1 INTEGER, DP2 INTEGER) PARAMETER STYLE JAVA LANGUAGE JAVA From 31c90ddb632b40cbbcce816d247cb1dd2504b352 Mon Sep 17 00:00:00 2001 From: min1854 <1042039351@qq.com> Date: Sat, 8 Apr 2023 21:03:20 +0800 Subject: [PATCH 3/3] check style --- .../apache/ibatis/binding/MapperMethod.java | 2 -- .../result/DefaultMapResultHandler.java | 4 ++-- .../org/apache/ibatis/session/SqlSession.java | 2 ++ .../ibatis/session/SqlSessionManager.java | 4 +++- .../session/defaults/DefaultSqlSession.java | 3 ++- .../apache/ibatis/session/SqlSessionTest.java | 5 +---- .../submitted/mapkey_value/NoticeMapper.java | 19 +++++++++++++++++-- .../apache/ibatis/builder/MapperConfig.xml | 2 +- .../databases/blog/blog-derby-dataload.sql | 2 +- .../databases/blog/blog-derby-schema.sql | 2 +- 10 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/apache/ibatis/binding/MapperMethod.java b/src/main/java/org/apache/ibatis/binding/MapperMethod.java index ba1f431fd61..92e3c7729c3 100644 --- a/src/main/java/org/apache/ibatis/binding/MapperMethod.java +++ b/src/main/java/org/apache/ibatis/binding/MapperMethod.java @@ -374,7 +374,6 @@ public String getMapKey() { return mapKey; } - public String getMapValue() { return mapValue; } @@ -403,5 +402,4 @@ private String getMapValue(Method method) { } - } diff --git a/src/main/java/org/apache/ibatis/executor/result/DefaultMapResultHandler.java b/src/main/java/org/apache/ibatis/executor/result/DefaultMapResultHandler.java index 938340dc47c..2f933a2ee0a 100644 --- a/src/main/java/org/apache/ibatis/executor/result/DefaultMapResultHandler.java +++ b/src/main/java/org/apache/ibatis/executor/result/DefaultMapResultHandler.java @@ -37,8 +37,8 @@ public class DefaultMapResultHandler implements ResultHandler { private final ReflectorFactory reflectorFactory; @SuppressWarnings("unchecked") - public DefaultMapResultHandler(String mapKey, String mapValue, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, - ReflectorFactory reflectorFactory) { + public DefaultMapResultHandler(String mapKey, String mapValue, ObjectFactory objectFactory, + ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) { this.objectFactory = objectFactory; this.objectWrapperFactory = objectWrapperFactory; this.reflectorFactory = reflectorFactory; diff --git a/src/main/java/org/apache/ibatis/session/SqlSession.java b/src/main/java/org/apache/ibatis/session/SqlSession.java index 3e6da36aee5..c8804c9a092 100644 --- a/src/main/java/org/apache/ibatis/session/SqlSession.java +++ b/src/main/java/org/apache/ibatis/session/SqlSession.java @@ -172,6 +172,7 @@ public interface SqlSession extends Closeable { * The property to use as key for each value in the list. * @param mapValue * The property to use as value for each value in the list. + * * @return Map containing key pair data. */ Map selectMap(String statement, Object parameter, String mapKey, String mapValue); @@ -194,6 +195,7 @@ public interface SqlSession extends Closeable { * The property to use as value for each value in the list. * @param rowBounds * Bounds to limit object retrieval + * * @return Map containing key pair data. */ Map selectMap(String statement, Object parameter, String mapKey, String mapValue, RowBounds rowBounds); diff --git a/src/main/java/org/apache/ibatis/session/SqlSessionManager.java b/src/main/java/org/apache/ibatis/session/SqlSessionManager.java index bf4c281433b..f79e6ce578b 100644 --- a/src/main/java/org/apache/ibatis/session/SqlSessionManager.java +++ b/src/main/java/org/apache/ibatis/session/SqlSessionManager.java @@ -182,8 +182,10 @@ public Map selectMap(String statement, Object parameter, String map public Map selectMap(String statement, Object parameter, String mapKey, String mapValue) { return sqlSessionProxy.selectMap(statement, parameter, mapKey, mapValue); } + @Override - public Map selectMap(String statement, Object parameter, String mapKey, String mapValue, RowBounds rowBounds) { + public Map selectMap(String statement, Object parameter, String mapKey, String mapValue, + RowBounds rowBounds) { return sqlSessionProxy.selectMap(statement, parameter, mapKey, rowBounds); } diff --git a/src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession.java b/src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession.java index 21472ece96a..e3575726d2e 100644 --- a/src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession.java +++ b/src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession.java @@ -105,7 +105,8 @@ public Map selectMap(String statement, Object parameter, String map } @Override - public Map selectMap(String statement, Object parameter, String mapKey, String mapValue, RowBounds rowBounds) { + public Map selectMap(String statement, Object parameter, String mapKey, String mapValue, + RowBounds rowBounds) { final List list = selectList(statement, parameter, rowBounds); final DefaultMapResultHandler mapResultHandler = new DefaultMapResultHandler<>(mapKey, mapValue, configuration.getObjectFactory(), configuration.getObjectWrapperFactory(), configuration.getReflectorFactory()); diff --git a/src/test/java/org/apache/ibatis/session/SqlSessionTest.java b/src/test/java/org/apache/ibatis/session/SqlSessionTest.java index d6e6f9a14a3..6af36983e30 100644 --- a/src/test/java/org/apache/ibatis/session/SqlSessionTest.java +++ b/src/test/java/org/apache/ibatis/session/SqlSessionTest.java @@ -28,7 +28,6 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.function.Consumer; import javassist.util.proxy.Proxy; @@ -184,9 +183,7 @@ void shouldSelectAllAuthorsAsMap() { @Test public void shouldGroupStatusAsMap() { - try ( - SqlSession sqlSession = sqlMapper.openSession() - ) { + try (SqlSession sqlSession = sqlMapper.openSession()) { NoticeMapper mapper = sqlSession.getMapper(NoticeMapper.class); Map statusCount = mapper.groupStatus(); assertEquals(2, statusCount.size()); diff --git a/src/test/java/org/apache/ibatis/submitted/mapkey_value/NoticeMapper.java b/src/test/java/org/apache/ibatis/submitted/mapkey_value/NoticeMapper.java index 1d73302faf5..963b195eec4 100644 --- a/src/test/java/org/apache/ibatis/submitted/mapkey_value/NoticeMapper.java +++ b/src/test/java/org/apache/ibatis/submitted/mapkey_value/NoticeMapper.java @@ -1,10 +1,25 @@ +/* + * Copyright 2009-2023 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 + * + * https://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.apache.ibatis.submitted.mapkey_value; +import java.util.Map; + import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.MapValue; -import java.util.Map; - public interface NoticeMapper { @MapKey("status") diff --git a/src/test/resources/org/apache/ibatis/builder/MapperConfig.xml b/src/test/resources/org/apache/ibatis/builder/MapperConfig.xml index 9ce22d85e76..5b3de89050c 100644 --- a/src/test/resources/org/apache/ibatis/builder/MapperConfig.xml +++ b/src/test/resources/org/apache/ibatis/builder/MapperConfig.xml @@ -1,7 +1,7 @@