diff --git a/base/src/test/java/tk/mybatis/mapper/rawresultmap/RawResultMapTest.java b/base/src/test/java/tk/mybatis/mapper/rawresultmap/RawResultMapTest.java index 334a7e515..07a77a7dd 100644 --- a/base/src/test/java/tk/mybatis/mapper/rawresultmap/RawResultMapTest.java +++ b/base/src/test/java/tk/mybatis/mapper/rawresultmap/RawResultMapTest.java @@ -10,6 +10,7 @@ import java.io.IOException; import java.io.Reader; import java.net.URL; +import java.util.Arrays; import java.util.List; /** @@ -45,55 +46,56 @@ public void testSelect() { System.out.println("------selectAll------"); users = mapper.selectAll(); - users.forEach(u -> { - System.out.println(u); - Assert.assertNotNull(u.getUname()); - Assert.assertNotNull(u.getAge()); - Assert.assertNotNull(u.getCreateTime()); - Assert.assertNull(u.getEmail()); - }); - System.out.println("------------"); + userAssert(users); + System.out.println("###################"); System.out.println("------selectRawAnnotation------"); users = mapper.selectRawAnnotation(); - users.forEach(u -> { - System.out.println(u); - Assert.assertNotNull(u.getUname()); - Assert.assertNotNull(u.getAge()); - Assert.assertNotNull(u.getCreateTime()); - Assert.assertNotNull(u.getEmail()); - }); - System.out.println("------------"); + userAssert(users); + System.out.println("###################"); + + System.out.println("------selectRawAnnotationResultMap------"); + users = mapper.selectRawAnnotationResultMap(); + userAssert(users); + System.out.println("###################"); System.out.println("------fetchRawResultMap------"); users = mapper.fetchRawResultMap(); - users.forEach(u -> { - System.out.println(u); - Assert.assertNotNull(u.getUname()); - Assert.assertNotNull(u.getAge()); - Assert.assertNotNull(u.getCreateTime()); - Assert.assertNotNull(u.getEmail()); - }); - System.out.println("------------"); + userAssert(users); + System.out.println("###################"); + + System.out.println("------fetchDynamicResultMap------"); + users = mapper.fetchDynamicResultMap(); + userAssert(users); + System.out.println("###################"); System.out.println("------fetchRawResultType------"); users = mapper.fetchRawResultType(); - users.forEach(u -> { - System.out.println(u); - Assert.assertNotNull(u.getUname()); - Assert.assertNotNull(u.getAge()); - Assert.assertNotNull(u.getCreateTime()); - Assert.assertNotNull(u.getEmail()); - }); - System.out.println("------------"); + userAssert(users); + System.out.println("###################"); + + System.out.println("------fetchDynamicSqlType------"); + users = mapper.fetchDynamicSqlType(Arrays.asList(1, 2, 3)); + userAssert(users); + System.out.println("###################"); System.out.println("------getMapUser------"); System.out.println(mapper.getMapUser()); - System.out.println("------------"); + System.out.println("###################"); System.out.println(mapper.selectCount2()); + } finally { sqlSession.close(); } } + + private static void userAssert(List users) { + users.forEach(u -> { + System.out.println(u); + Assert.assertNotNull(u.getUname()); + Assert.assertNotNull(u.getAge()); + Assert.assertNotNull(u.getCreateTime()); + }); + } } diff --git a/base/src/test/java/tk/mybatis/mapper/rawresultmap/UserMapper.java b/base/src/test/java/tk/mybatis/mapper/rawresultmap/UserMapper.java index 80a6f759b..707ad2288 100644 --- a/base/src/test/java/tk/mybatis/mapper/rawresultmap/UserMapper.java +++ b/base/src/test/java/tk/mybatis/mapper/rawresultmap/UserMapper.java @@ -1,5 +1,7 @@ package tk.mybatis.mapper.rawresultmap; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.ResultMap; import org.apache.ibatis.annotations.Select; import tk.mybatis.mapper.common.BaseMapper; @@ -15,10 +17,18 @@ public interface UserMapper extends BaseMapper { @Select("SELECT * FROM user") List selectRawAnnotation(); + @Select("SELECT * FROM user") + @ResultMap("BaseResultMap") + List selectRawAnnotationResultMap(); + List fetchRawResultType(); + List fetchDynamicSqlType(@Param("ids") List ids); + List fetchRawResultMap(); + List fetchDynamicResultMap(); + Map getMapUser(); Integer selectCount2(); diff --git a/base/src/test/java/tk/mybatis/mapper/rawresultmap/UserMapper.xml b/base/src/test/java/tk/mybatis/mapper/rawresultmap/UserMapper.xml index d23931675..d3b05a621 100644 --- a/base/src/test/java/tk/mybatis/mapper/rawresultmap/UserMapper.xml +++ b/base/src/test/java/tk/mybatis/mapper/rawresultmap/UserMapper.xml @@ -9,7 +9,7 @@ - + @@ -17,10 +17,30 @@ select * from user + + + + + diff --git a/core/src/main/java/tk/mybatis/mapper/mapperhelper/MapperHelper.java b/core/src/main/java/tk/mybatis/mapper/mapperhelper/MapperHelper.java index 6d12a2b9a..efc508c5b 100644 --- a/core/src/main/java/tk/mybatis/mapper/mapperhelper/MapperHelper.java +++ b/core/src/main/java/tk/mybatis/mapper/mapperhelper/MapperHelper.java @@ -33,9 +33,9 @@ import org.apache.ibatis.logging.LogFactory; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.ResultMap; +import org.apache.ibatis.mapping.ResultMapping; import org.apache.ibatis.mapping.SqlCommandType; import org.apache.ibatis.reflection.MetaObject; -import org.apache.ibatis.scripting.defaults.RawSqlSource; import org.apache.ibatis.session.Configuration; import tk.mybatis.mapper.MapperException; import tk.mybatis.mapper.annotation.RegisterMapper; @@ -303,11 +303,27 @@ public void processMappedStatement(MappedStatement ms) { setSqlSource(ms, mapperTemplate); } - // 如果是原生mybatisSqlSource的查询,添加ResultMap - if (ms.getSqlSource() instanceof RawSqlSource - && ms.getSqlCommandType() == SqlCommandType.SELECT) { - if (ms.getResultMaps() != null && !ms.getResultMaps().isEmpty()) { - setRawSqlSourceMapper(ms); + // 如果没有resultMaps, 有则设置一个默认的resultMaps + if (ms.getSqlCommandType() == SqlCommandType.SELECT) { + List resultMaps = ms.getResultMaps(); + if (resultMaps != null) { + List modifiableResultMaps = new ArrayList<>(resultMaps); + for (int i = 0; i < resultMaps.size(); i++) { + List mappings = resultMaps.get(i).getResultMappings(); + // 只有type,没有mappings的情况下 + if (mappings == null || mappings.isEmpty()) { + EntityTable entityTable = EntityHelper.getEntityTableOrNull(resultMaps.get(i).getType()); + // 如果有@Table注解,则可以获取到entityTable + if (entityTable != null) { + ResultMap resultMap = entityTable.getResultMap(ms.getConfiguration()); + if (resultMap != null) { + modifiableResultMaps.set(i, resultMap); + MetaObject metaObject = MetaObjectUtil.forObject(ms); + metaObject.setValue("resultMaps", Collections.unmodifiableList(modifiableResultMaps)); + } + } + } + } } } } @@ -396,23 +412,4 @@ public void setSqlSource(MappedStatement ms, MapperTemplate mapperTemplate) { } } - /** - * 设置原生Mybatis查询的实体映射, - *

- * JPA的注解优先级将高于mybatis自动映射 - */ - public void setRawSqlSourceMapper(MappedStatement ms) { - - EntityTable entityTable = EntityHelper.getEntityTableOrNull(ms.getResultMaps().get(0).getType()); - if (entityTable != null) { - List resultMaps = new ArrayList<>(); - ResultMap resultMap = entityTable.getResultMap(ms.getConfiguration()); - if (resultMap != null) { - resultMaps.add(resultMap); - MetaObject metaObject = MetaObjectUtil.forObject(ms); - metaObject.setValue("resultMaps", Collections.unmodifiableList(resultMaps)); - } - } - } - } \ No newline at end of file