Ver Fonte

优化分页拦截器数据类型与方言实现类配置.

聂秋秋 há 5 anos atrás
pai
commit
3f810a5171

+ 46 - 6
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/PaginationInterceptor.java

@@ -28,6 +28,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.handlers.AbstractSqlParserHandler;
 import com.baomidou.mybatisplus.extension.handlers.AbstractSqlParserHandler;
 import com.baomidou.mybatisplus.extension.plugins.pagination.DialectFactory;
 import com.baomidou.mybatisplus.extension.plugins.pagination.DialectFactory;
 import com.baomidou.mybatisplus.extension.plugins.pagination.DialectModel;
 import com.baomidou.mybatisplus.extension.plugins.pagination.DialectModel;
+import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.IDialect;
 import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
 import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
 import com.baomidou.mybatisplus.extension.toolkit.SqlParserUtils;
 import com.baomidou.mybatisplus.extension.toolkit.SqlParserUtils;
 import lombok.Setter;
 import lombok.Setter;
@@ -53,6 +54,7 @@ import java.sql.ResultSet;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Properties;
 import java.util.Properties;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
@@ -80,15 +82,31 @@ public class PaginationInterceptor extends AbstractSqlParserHandler implements I
      * 单页限制 500 条,小于 0 如 -1 不受限制
      * 单页限制 500 条,小于 0 如 -1 不受限制
      */
      */
     protected long limit = 500L;
     protected long limit = 500L;
+    /**
+     * 数据库类型
+     *
+     * @since 3.3.1
+     */
+    private DbType dbType;
+    /**
+     * 方言实现类
+     *
+     * @since 3.3.1
+     */
+    private IDialect dialect;
     /**
     /**
      * 方言类型(数据库名,全小写) <br>
      * 方言类型(数据库名,全小写) <br>
      * 如果用的我们支持分页的数据库但获取数据库类型不正确则可以配置该值进行校正
      * 如果用的我们支持分页的数据库但获取数据库类型不正确则可以配置该值进行校正
+     * @deprecated {@link #setDbType(DbType)}
      */
      */
+    @Deprecated
     protected String dialectType;
     protected String dialectType;
     /**
     /**
      * 方言实现类<br>
      * 方言实现类<br>
      * 注意!实现 com.baomidou.mybatisplus.extension.plugins.pagination.dialects.IDialect 接口的子类
      * 注意!实现 com.baomidou.mybatisplus.extension.plugins.pagination.dialects.IDialect 接口的子类
+     * @deprecated 3.3.1 {@link #setDialect(IDialect)}
      */
      */
+    @Deprecated
     protected String dialectClazz;
     protected String dialectClazz;
 
 
     /**
     /**
@@ -194,8 +212,6 @@ public class PaginationInterceptor extends AbstractSqlParserHandler implements I
 
 
         String originalSql = boundSql.getSql();
         String originalSql = boundSql.getSql();
         Connection connection = (Connection) invocation.getArgs()[0];
         Connection connection = (Connection) invocation.getArgs()[0];
-        DbType dbType = StringUtils.isNotBlank(dialectType) ? DbType.getDbType(dialectType)
-            : JdbcUtils.getDbType(connection.getMetaData().getURL());
 
 
         if (page.isSearchCount()) {
         if (page.isSearchCount()) {
             SqlInfo sqlInfo = SqlParserUtils.getOptimizeCountSql(page.optimizeCountSql(), countSqlParser, originalSql);
             SqlInfo sqlInfo = SqlParserUtils.getOptimizeCountSql(page.optimizeCountSql(), countSqlParser, originalSql);
@@ -204,9 +220,10 @@ public class PaginationInterceptor extends AbstractSqlParserHandler implements I
                 return null;
                 return null;
             }
             }
         }
         }
-
+        DbType dbType = Optional.ofNullable(this.dbType).orElse(JdbcUtils.getDbType(connection.getMetaData().getURL()));
+        IDialect dialect = Optional.ofNullable(this.dialect).orElse(DialectFactory.getDialect(dbType.getDialect()));
         String buildSql = concatOrderBy(originalSql, page);
         String buildSql = concatOrderBy(originalSql, page);
-        DialectModel model = DialectFactory.buildPaginationSql(page, buildSql, dbType, dialectClazz);
+        DialectModel model = dialect.buildPaginationSql(buildSql, page.offset(), page.getSize());
         Configuration configuration = mappedStatement.getConfiguration();
         Configuration configuration = mappedStatement.getConfiguration();
         List<ParameterMapping> mappings = new ArrayList<>(boundSql.getParameterMappings());
         List<ParameterMapping> mappings = new ArrayList<>(boundSql.getParameterMappings());
         Map<String, Object> additionalParameters = (Map<String, Object>) metaObject.getValue("delegate.boundSql.additionalParameters");
         Map<String, Object> additionalParameters = (Map<String, Object>) metaObject.getValue("delegate.boundSql.additionalParameters");
@@ -276,10 +293,33 @@ public class PaginationInterceptor extends AbstractSqlParserHandler implements I
         String dialectType = prop.getProperty("dialectType");
         String dialectType = prop.getProperty("dialectType");
         String dialectClazz = prop.getProperty("dialectClazz");
         String dialectClazz = prop.getProperty("dialectClazz");
         if (StringUtils.isNotBlank(dialectType)) {
         if (StringUtils.isNotBlank(dialectType)) {
-            this.dialectType = dialectType;
+            setDialectType(dialectType);
         }
         }
         if (StringUtils.isNotBlank(dialectClazz)) {
         if (StringUtils.isNotBlank(dialectClazz)) {
-            this.dialectClazz = dialectClazz;
+            setDialectClazz(dialectClazz);
         }
         }
     }
     }
+
+    /**
+     * 设置方言类型
+     *
+     * @param dialectType 数据库名,全小写
+     * @deprecated 3.3.1 {@link #setDbType(DbType)}
+     */
+    @Deprecated
+    public void setDialectType(String dialectType) {
+        setDbType(DbType.getDbType(dialectType));
+    }
+
+    /**
+     * 设置方言实现类
+     *
+     * @param dialectClazz 方言实现类
+     * @deprecated 3.3.1 {@link #setDialect(IDialect)}}
+     */
+    @Deprecated
+    public void setDialectClazz(String dialectClazz) {
+        setDialect(DialectFactory.getDialect(dialectClazz));
+    }
+
 }
 }

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

@@ -50,6 +50,7 @@ public class DialectFactory {
      * @param dialectClazz 数据库方言
      * @param dialectClazz 数据库方言
      * @return 分页模型
      * @return 分页模型
      */
      */
+    @Deprecated
     public static DialectModel buildPaginationSql(IPage<?> page, String buildSql, DbType dbType, String dialectClazz) {
     public static DialectModel buildPaginationSql(IPage<?> page, String buildSql, DbType dbType, String dialectClazz) {
         // fix #196
         // fix #196
         return getDialect(dbType, dialectClazz).buildPaginationSql(buildSql, page.offset(), page.getSize());
         return getDialect(dbType, dialectClazz).buildPaginationSql(buildSql, page.offset(), page.getSize());
@@ -61,22 +62,37 @@ public class DialectFactory {
      * @param dbType       数据库类型
      * @param dbType       数据库类型
      * @param dialectClazz 自定义方言实现类
      * @param dialectClazz 自定义方言实现类
      * @return ignore
      * @return ignore
+     * @deprecated 3.3.1 {@link #getDialect(String)}
      */
      */
+    @Deprecated
     private static IDialect getDialect(DbType dbType, String dialectClazz) {
     private static IDialect getDialect(DbType dbType, String dialectClazz) {
-        return DIALECT_CACHE.computeIfAbsent(dbType.getDb(), key -> {
-            IDialect dialect = null;
-            String dialectClassName = StringUtils.isBlank(dialectClazz) ? dbType.getDialect() : dialectClazz;
-            try {
-                Class<?> clazz = Class.forName(dialectClassName);
-                if (IDialect.class.isAssignableFrom(clazz)) {
-                    dialect = (IDialect) ClassUtils.newInstance(clazz);
-                }
-            } catch (ClassNotFoundException e) {
-                throw ExceptionUtils.mpe("Class : %s is not found", dialectClazz);
+        String dialectClassName = StringUtils.isBlank(dialectClazz) ? dbType.getDialect() : dialectClazz;
+        return DIALECT_CACHE.computeIfAbsent(dialectClassName, DialectFactory::classToDialect);
+    }
+
+    /**
+     * 获取实现方言
+     *
+     * @param dialectClazz 方言全类名
+     * @return 方言实现对象
+     * @since 3.3.1
+     */
+    public static IDialect getDialect(String dialectClazz) {
+        return DIALECT_CACHE.computeIfAbsent(dialectClazz, DialectFactory::classToDialect);
+    }
+
+    private static IDialect classToDialect(String dialectClazz){
+        IDialect dialect = null;
+        try {
+            Class<?> clazz = Class.forName(dialectClazz);
+            if (IDialect.class.isAssignableFrom(clazz)) {
+                dialect = (IDialect) ClassUtils.newInstance(clazz);
             }
             }
-            /* 未配置方言则抛出异常 */
-            Assert.notNull(dialect, "The value of the dialect property in mybatis configuration.xml is not defined.");
-            return dialect;
-        });
+        } catch (ClassNotFoundException e) {
+            throw ExceptionUtils.mpe("Class : %s is not found", dialectClazz);
+        }
+        /* 未配置方言则抛出异常 */
+        Assert.notNull(dialect, "The value of the dialect property in mybatis configuration.xml is not defined.");
+        return dialect;
     }
     }
 }
 }