Browse Source

[更新] mapper自定义分页方法(IPage<entity>)支持注解形式,并且可无resultType注解

miemie 6 years ago
parent
commit
5f80f973e1

+ 24 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisMapperAnnotationBuilder.java

@@ -15,6 +15,7 @@
  */
 package com.baomidou.mybatisplus.core;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
 import org.apache.ibatis.annotations.*;
 import org.apache.ibatis.annotations.ResultMap;
@@ -395,6 +396,16 @@ public class MybatisMapperAnnotationBuilder extends MapperAnnotationBuilder {
     private Class<?> getReturnType(Method method) {
         Class<?> returnType = method.getReturnType();
         Type resolvedReturnType = TypeParameterResolver.resolveReturnType(method, type);
+        /**
+         * 新加入下面 4 行,有 ResultType 注解则以注解优先
+         */
+        ResultType resultType = method.getAnnotation(ResultType.class);
+        if (resultType != null) {
+            return resultType.value();
+        }
+        /**
+         * 新加入上面 4 行,有 ResultType 注解则以注解优先
+         */
         if (resolvedReturnType instanceof Class) {
             returnType = (Class<?>) resolvedReturnType;
             if (returnType.isArray()) {
@@ -444,6 +455,19 @@ public class MybatisMapperAnnotationBuilder extends MapperAnnotationBuilder {
                     returnType = (Class<?>) returnTypeParameter;
                 }
             }
+            /**
+             * 新加入下面 7 行
+             */
+            else if (IPage.class.equals(rawType)) {
+                Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
+                Type returnTypeParameter = actualTypeArguments[0];
+                if (returnTypeParameter instanceof Class<?>) {
+                    returnType = (Class<?>) returnTypeParameter;
+                }
+            }
+            /**
+             * 新加入上面 7 行
+             */
         }
 
         return returnType;

+ 7 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/mapper/commons/CommonDataMapper.java

@@ -1,6 +1,8 @@
 package com.baomidou.mybatisplus.test.base.mapper.commons;
 
 import com.baomidou.mybatisplus.annotation.SqlParser;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.test.base.entity.CommonData;
 import com.baomidou.mybatisplus.test.base.mapper.MyBaseMapper;
 import org.apache.ibatis.annotations.ResultType;
@@ -20,7 +22,11 @@ public interface CommonDataMapper extends MyBaseMapper<CommonData> {
     @Select("select * from common_data")
     List<CommonData> getAllNoTenant();
 
-    //    @ResultType(CommonData.class)
+    @ResultType(CommonData.class)
     @Select("select * from common_data where id = #{ooxx}")
     Optional<CommonData> getById(Long id);
+
+    //    @ResultType(CommonData.class)
+    @Select("select * from common_data")
+    IPage<CommonData> myPage(Page<CommonData> page);
 }

+ 10 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/MysqlTestDataMapperTest.java

@@ -306,6 +306,16 @@ public class MysqlTestDataMapperTest {
         System.out.println(JSON.toJSONString(dataPage));
         System.out.println(JSON.toJSON(dataPage.convert(CommonData::getId)));
 
+        Page<CommonData> commonDataPage = new Page<>(1, 5);
+        commonDataPage.setDesc("c_time", "u_time");
+        IPage<CommonData> commonDataDataPage = commonMapper.myPage(commonDataPage);
+        Assert.assertSame(commonDataDataPage, commonDataPage);
+        Assert.assertNotEquals(null, commonDataDataPage.getTotal());
+        Assert.assertNotEquals(0, commonDataDataPage.getRecords().size());
+        Assert.assertTrue(CollectionUtils.isNotEmpty(commonDataDataPage.getRecords()));
+        System.out.println(JSON.toJSONString(commonDataDataPage));
+        System.out.println(JSON.toJSON(commonDataDataPage.convert(CommonData::getId)));
+
         Page<CommonLogicData> logicPage = new Page<>(1, 5);
         IPage<CommonLogicData> logicDataPage = commonLogicMapper.selectPage(logicPage, null);
         Assert.assertSame(logicDataPage, logicPage);