فهرست منبع

DB2Dialect完成, over分页方言, 全部数据库类型除了 mysql 系之外待测试验证

miemie 6 سال پیش
والد
کامیت
64fca831a3

+ 2 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/DialectFactory.java

@@ -112,8 +112,8 @@ public class DialectFactory {
                 return new MariaDBDialect();
             case ORACLE:
                 return new OracleDialect();
-//            case DB2:
-//                return new DB2Dialect();
+            case DB2:
+                return new DB2Dialect();
             case H2:
                 return new H2Dialect();
             case SQL_SERVER:

+ 10 - 9
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/DialectModel.java

@@ -13,7 +13,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.function.Consumer;
 import java.util.function.Function;
-import java.util.function.Supplier;
 
 /**
  * 分页参数动态化所需 model
@@ -36,7 +35,7 @@ public class DialectModel {
      * 提供 Configuration
      */
     @Getter(AccessLevel.NONE)
-    private Supplier<Configuration> configurationSupplier = () -> null;
+    private Configuration configuration;
     /**
      * 消费偏移量
      */
@@ -62,16 +61,20 @@ public class DialectModel {
      * 设置消费
      * <p>
      * 带下标的
+     * <p>
+     * mark: 标记一下,暂时没看到哪个数据库的分页方言会存在使用该方法
+     * </p>
      *
      * @return this
      */
+    @SuppressWarnings("unused")
     public DialectModel setConsumer(boolean isFirstParam, Function<List<ParameterMapping>, Integer> function) {
         if (isFirstParam) {
             firstParamConsumer = i -> i.add(function.apply(i), new ParameterMapping
-                .Builder(configurationSupplier.get(), FIRST_PARAM_NAME, long.class).build());
+                .Builder(configuration, FIRST_PARAM_NAME, long.class).build());
         } else {
             secondParamConsumer = i -> i.add(function.apply(i), new ParameterMapping
-                .Builder(configurationSupplier.get(), SECOND_PARAM_NAME, long.class).build());
+                .Builder(configuration, SECOND_PARAM_NAME, long.class).build());
         }
         return this;
     }
@@ -85,11 +88,9 @@ public class DialectModel {
      */
     public DialectModel setConsumer(boolean isFirstParam) {
         if (isFirstParam) {
-            firstParamConsumer = i -> i.add(new ParameterMapping.Builder(configurationSupplier.get(),
-                FIRST_PARAM_NAME, long.class).build());
+            firstParamConsumer = i -> i.add(new ParameterMapping.Builder(configuration, FIRST_PARAM_NAME, long.class).build());
         } else {
-            secondParamConsumer = i -> i.add(new ParameterMapping.Builder(configurationSupplier.get(),
-                SECOND_PARAM_NAME, long.class).build());
+            secondParamConsumer = i -> i.add(new ParameterMapping.Builder(configuration, SECOND_PARAM_NAME, long.class).build());
         }
         return this;
     }
@@ -114,7 +115,7 @@ public class DialectModel {
     public void consumers(List<ParameterMapping> mappings, Configuration configuration) {
         Assert.notNull(mappings, "List<ParameterMapping> must not be null!");
         Assert.notNull(configuration, "configuration must not be null!");
-        configurationSupplier = () -> configuration;
+        this.configuration = configuration;
         firstParamConsumer.accept(mappings);
         secondParamConsumer.accept(mappings);
     }

+ 68 - 67
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/DB2Dialect.java

@@ -1,67 +1,68 @@
-///*
-// * Copyright (c) 2011-2014, hubin (jobob@qq.com).
-// * <p>
-// * 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
-// * <p>
-// * http://www.apache.org/licenses/LICENSE-2.0
-// * <p>
-// * 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 com.baomidou.mybatisplus.extension.plugins.pagination.dialects;
-//
-//import com.baomidou.mybatisplus.core.toolkit.StringPool;
-//
-///**
-// * <p>
-// * DB2 数据库分页方言
-// * </p>
-// *
-// * @author hubin
-// * @since 2016-11-10
-// */
-//public class DB2Dialect implements IDialect {
-//
-//    private static String getRowNumber(String originalSql) {
-//        StringBuilder rownumber = new StringBuilder(50).append("rownumber() over(");
-//        int orderByIndex = originalSql.toLowerCase().indexOf("order by");
-//        if (orderByIndex > 0 && !hasDistinct(originalSql)) {
-//            rownumber.append(originalSql.substring(orderByIndex));
-//        }
-//        rownumber.append(") as rownumber_,");
-//        return rownumber.toString();
-//    }
-//
-//    private static boolean hasDistinct(String originalSql) {
-//        return originalSql.toLowerCase().contains("select distinct");
-//    }
-//
-//    @Override
-//    public String buildPaginationSql(String originalSql, long offset, long limit) {
-//        int startOfSelect = originalSql.toLowerCase().indexOf("select");
-//        StringBuilder pagingSelect = new StringBuilder(originalSql.length() + 100)
-//            .append(originalSql, 0, startOfSelect).append("select * from ( select ")
-//            .append(getRowNumber(originalSql));
-//        if (hasDistinct(originalSql)) {
-//            pagingSelect.append(" row_.* from ( ").append(originalSql.substring(startOfSelect)).append(" ) as row_");
-//        } else {
-//            pagingSelect.append(originalSql.substring(startOfSelect + 6));
-//        }
-//
-//        // 20180829 modify by hepengju
-//        // https://github.com/baomidou/mybatis-plus/issues/450
-//        if (offset > 0) {
-//            String endString = offset + StringPool.PLUS + limit;
-//            pagingSelect.append(" fetch first ").append(endString).append(" rows only) as temp_ where rownumber_ ")
-//                .append("> ").append(offset);
-//        } else {
-//            pagingSelect.append(" fetch first ").append(limit).append(" rows only) as temp_ ");
-//        }
-//        return pagingSelect.toString();
-//    }
-//}
+/*
+ * Copyright (c) 2011-2014, hubin (jobob@qq.com).
+ * <p>
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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 com.baomidou.mybatisplus.extension.plugins.pagination.dialects;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.DialectModel;
+
+/**
+ * <p>
+ * DB2 数据库分页方言
+ * </p>
+ *
+ * @author hubin
+ * @since 2016-11-10
+ */
+public class DB2Dialect implements IDialect {
+
+    private static String getRowNumber(String originalSql) {
+        StringBuilder rownumber = new StringBuilder(50).append("rownumber() over(");
+        int orderByIndex = originalSql.toLowerCase().indexOf("order by");
+        if (orderByIndex > 0 && !hasDistinct(originalSql)) {
+            rownumber.append(originalSql.substring(orderByIndex));
+        }
+        rownumber.append(") as rownumber_,");
+        return rownumber.toString();
+    }
+
+    private static boolean hasDistinct(String originalSql) {
+        return originalSql.toLowerCase().contains("select distinct");
+    }
+
+    @Override
+    public DialectModel buildPaginationSql(String originalSql, long offset, long limit) {
+        int startOfSelect = originalSql.toLowerCase().indexOf("select");
+        StringBuilder pagingSelect = new StringBuilder(originalSql.length() + 100)
+            .append(originalSql, 0, startOfSelect).append("select * from ( select ")
+            .append(getRowNumber(originalSql));
+        if (hasDistinct(originalSql)) {
+            pagingSelect.append(" row_.* from ( ").append(originalSql.substring(startOfSelect)).append(" ) as row_");
+        } else {
+            pagingSelect.append(originalSql.substring(startOfSelect + 6));
+        }
+
+        // 20180829 modify by hepengju
+        // https://github.com/baomidou/mybatis-plus/issues/450
+        if (offset > 0) {
+            long firstParam = offset + limit;
+            pagingSelect.append(" fetch first ").append(FIRST_MARK).append(" rows only) as temp_ where rownumber_ ")
+                .append("> ").append(SECOND_MARK);
+            return new DialectModel(pagingSelect.toString(), firstParam, offset).setConsumerChain();
+        } else {
+            pagingSelect.append(" fetch first ").append(FIRST_MARK).append(" rows only) as temp_ ");
+            return new DialectModel(pagingSelect.toString(), limit, offset).setConsumer(true);
+        }
+    }
+}

+ 17 - 0
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/DB2DialectTest.java

@@ -0,0 +1,17 @@
+package com.baomidou.mybatisplus.extension.plugins.pagination.dialects;
+
+import org.junit.Test;
+
+/**
+ * @author miemie
+ * @since 2018-11-01
+ */
+public class DB2DialectTest {
+
+    @Test
+    public void m1() {
+        String sql = "select * from xxx where id = ? order by id";
+        DB2Dialect db2Dialect = new DB2Dialect();
+        System.out.println(db2Dialect.buildPaginationSql(sql, 1, 10).getDialectSql());
+    }
+}