소스 검색

page 分页新增控制是否优化 Count Sql 设置

= 7 년 전
부모
커밋
4479dd25d7

+ 4 - 3
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/mapper/MybatisMapWrapper.java

@@ -9,13 +9,14 @@ import com.baomidou.mybatisplus.toolkit.StringUtils;
 
 
 /**
 /**
  * <p>
  * <p>
- *     返回Map结果集,下划线转驼峰
+ * 返回Map结果集,下划线转驼峰
  * </p>
  * </p>
  *
  *
  * @author yuxiaobin
  * @author yuxiaobin
  * @date 2017/12/19
  * @date 2017/12/19
  */
  */
 public class MybatisMapWrapper extends MapWrapper {
 public class MybatisMapWrapper extends MapWrapper {
+
     public MybatisMapWrapper(MetaObject metaObject, Map<String, Object> map) {
     public MybatisMapWrapper(MetaObject metaObject, Map<String, Object> map) {
         super(metaObject, map);
         super(metaObject, map);
     }
     }
@@ -23,8 +24,8 @@ public class MybatisMapWrapper extends MapWrapper {
     @Override
     @Override
     public String findProperty(String name, boolean useCamelCaseMapping) {
     public String findProperty(String name, boolean useCamelCaseMapping) {
         if (useCamelCaseMapping
         if (useCamelCaseMapping
-                && ((name.charAt(0) >= 'A' && name.charAt(0) <= 'Z')
-                || name.contains("_"))) {
+            && ((name.charAt(0) >= 'A' && name.charAt(0) <= 'Z')
+            || name.contains("_"))) {
             return StringUtils.underlineToCamel(name);
             return StringUtils.underlineToCamel(name);
         }
         }
         return name;
         return name;

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/plugins/CachePaginationInterceptor.java

@@ -80,7 +80,7 @@ public class CachePaginationInterceptor extends PaginationInterceptor implements
             if (rowBounds instanceof Pagination) {
             if (rowBounds instanceof Pagination) {
                 Pagination page = (Pagination) rowBounds;
                 Pagination page = (Pagination) rowBounds;
                 if (page.isSearchCount()) {
                 if (page.isSearchCount()) {
-                    SqlInfo sqlInfo = SqlUtils.getCountOptimize(sqlParser, originalSql);
+                    SqlInfo sqlInfo = SqlUtils.getOptimizeCountSql(page.isOptimizeCountSql(), sqlParser, originalSql);
                     super.queryTotal(overflowCurrent, sqlInfo.getSql(), mappedStatement, boundSql, page, connection);
                     super.queryTotal(overflowCurrent, sqlInfo.getSql(), mappedStatement, boundSql, page, connection);
                     if (page.getTotal() <= 0) {
                     if (page.getTotal() <= 0) {
                         return invocation.proceed();
                         return invocation.proceed();

+ 4 - 4
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/plugins/PaginationInterceptor.java

@@ -121,7 +121,7 @@ public class PaginationInterceptor extends SqlParserHandler implements Intercept
             Pagination page = (Pagination) rowBounds;
             Pagination page = (Pagination) rowBounds;
             boolean orderBy = true;
             boolean orderBy = true;
             if (page.isSearchCount()) {
             if (page.isSearchCount()) {
-                SqlInfo sqlInfo = SqlUtils.getCountOptimize(sqlParser, originalSql);
+                SqlInfo sqlInfo = SqlUtils.getOptimizeCountSql(page.isOptimizeCountSql(), sqlParser, originalSql);
                 orderBy = sqlInfo.isOrderBy();
                 orderBy = sqlInfo.isOrderBy();
                 this.queryTotal(overflowCurrent, sqlInfo.getSql(), mappedStatement, boundSql, page, connection);
                 this.queryTotal(overflowCurrent, sqlInfo.getSql(), mappedStatement, boundSql, page, connection);
                 if (page.getTotal() <= 0) {
                 if (page.getTotal() <= 0) {
@@ -135,10 +135,10 @@ public class PaginationInterceptor extends SqlParserHandler implements Intercept
             originalSql = DialectFactory.buildPaginationSql(rowBounds, originalSql, dbType, dialectClazz);
             originalSql = DialectFactory.buildPaginationSql(rowBounds, originalSql, dbType, dialectClazz);
         }
         }
 
 
-		/*
+        /*
          * <p> 禁用内存分页 </p>
          * <p> 禁用内存分页 </p>
          * <p> 内存分页会查询所有结果出来处理(这个很吓人的),如果结果变化频繁这个数据还会不准。</p>
          * <p> 内存分页会查询所有结果出来处理(这个很吓人的),如果结果变化频繁这个数据还会不准。</p>
-		 */
+         */
         metaObject.setValue("delegate.boundSql.sql", originalSql);
         metaObject.setValue("delegate.boundSql.sql", originalSql);
         metaObject.setValue("delegate.rowBounds.offset", RowBounds.NO_ROW_OFFSET);
         metaObject.setValue("delegate.rowBounds.offset", RowBounds.NO_ROW_OFFSET);
         metaObject.setValue("delegate.rowBounds.limit", RowBounds.NO_ROW_LIMIT);
         metaObject.setValue("delegate.rowBounds.limit", RowBounds.NO_ROW_LIMIT);
@@ -166,7 +166,7 @@ public class PaginationInterceptor extends SqlParserHandler implements Intercept
             page.setTotal(total);
             page.setTotal(total);
             /*
             /*
              * 溢出总页数,设置第一页
              * 溢出总页数,设置第一页
-			 */
+             */
             int pages = page.getPages();
             int pages = page.getPages();
             if (overflowCurrent && (page.getCurrent() > pages)) {
             if (overflowCurrent && (page.getCurrent() > pages)) {
                 // 设置为第一条
                 // 设置为第一条

+ 6 - 4
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/plugins/pagination/optimize/JsqlParserCountOptimize.java

@@ -49,7 +49,9 @@ import net.sf.jsqlparser.statement.select.SelectItem;
  */
  */
 public class JsqlParserCountOptimize implements ISqlParser {
 public class JsqlParserCountOptimize implements ISqlParser {
 
 
-    // 日志
+    /**
+     * 日志
+     */
     private final Log logger = LogFactory.getLog(JsqlParserCountOptimize.class);
     private final Log logger = LogFactory.getLog(JsqlParserCountOptimize.class);
     private static final List<SelectItem> countSelectItem = countSelectItem();
     private static final List<SelectItem> countSelectItem = countSelectItem();
 
 
@@ -74,13 +76,13 @@ public class JsqlParserCountOptimize implements ISqlParser {
             //#95 Github, selectItems contains #{} ${}, which will be translated to ?, and it may be in a function: power(#{myInt},2)
             //#95 Github, selectItems contains #{} ${}, which will be translated to ?, and it may be in a function: power(#{myInt},2)
             for (SelectItem item : plainSelect.getSelectItems()) {
             for (SelectItem item : plainSelect.getSelectItems()) {
                 if (item.toString().contains("?")) {
                 if (item.toString().contains("?")) {
-                    sqlInfo.setSql(String.format(SqlUtils.SQL_BASE_COUNT, selectStatement.toString()));
+                    sqlInfo.setSql(SqlUtils.getOriginalCountSql(selectStatement.toString()));
                     return sqlInfo;
                     return sqlInfo;
                 }
                 }
             }
             }
             // 包含 distinct、groupBy不优化
             // 包含 distinct、groupBy不优化
             if (distinct != null || CollectionUtils.isNotEmpty(groupBy)) {
             if (distinct != null || CollectionUtils.isNotEmpty(groupBy)) {
-                sqlInfo.setSql(String.format(SqlUtils.SQL_BASE_COUNT, selectStatement.toString()));
+                sqlInfo.setSql(SqlUtils.getOriginalCountSql(selectStatement.toString()));
                 return sqlInfo;
                 return sqlInfo;
             }
             }
             // 优化 SQL
             // 优化 SQL
@@ -89,7 +91,7 @@ public class JsqlParserCountOptimize implements ISqlParser {
             return sqlInfo;
             return sqlInfo;
         } catch (Throwable e) {
         } catch (Throwable e) {
             // 无法优化使用原 SQL
             // 无法优化使用原 SQL
-            sqlInfo.setSql(String.format(SqlUtils.SQL_BASE_COUNT, sql));
+            sqlInfo.setSql(SqlUtils.getOriginalCountSql(sql));
             return sqlInfo;
             return sqlInfo;
         }
         }
     }
     }

+ 6 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/test/h2/H2Pagination4SqlTest.java

@@ -46,7 +46,13 @@ public class H2Pagination4SqlTest extends H2Test {
 
 
     @Test
     @Test
     public void testJoinTableWithPagination() {
     public void testJoinTableWithPagination() {
+        this.testOptimizeCountSqlPagination(false);
+        this.testOptimizeCountSqlPagination(true);
+    }
+
+    private void testOptimizeCountSqlPagination(boolean optimizeCountSql) {
         Page<H2Addr> page = new Page<H2Addr>(0, 3);
         Page<H2Addr> page = new Page<H2Addr>(0, 3);
+        page.setOptimizeCountSql(optimizeCountSql);
         List<H2Addr> addrList = userMapper.getAddrListByUserIdPage(101L, page);
         List<H2Addr> addrList = userMapper.getAddrListByUserIdPage(101L, page);
         Assert.assertNotEquals("Should have pagination info", 0, page.getTotal());
         Assert.assertNotEquals("Should have pagination info", 0, page.getTotal());
         Assert.assertEquals(3, addrList.size());
         Assert.assertEquals(3, addrList.size());

+ 0 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/mapper/EntityWrapper.java → mybatis-plus-support/src/main/java/com/baomidou/mybatisplus/mapper/EntityWrapper.java


+ 1 - 1
mybatis-plus-support/src/main/java/com/baomidou/mybatisplus/plugins/Page.java

@@ -40,7 +40,7 @@ public class Page<T> extends Pagination {
     private List<T> records = Collections.emptyList();
     private List<T> records = Collections.emptyList();
 
 
     /**
     /**
-     * 查询参数
+     * 查询参数( 不会传入到 xml 层,这里是 Controller 层与 service 层传递参数预留 )
      */
      */
     private Map<String, Object> condition;
     private Map<String, Object> condition;
 
 

+ 14 - 0
mybatis-plus-support/src/main/java/com/baomidou/mybatisplus/plugins/pagination/Pagination.java

@@ -70,6 +70,11 @@ public class Pagination extends RowBounds implements Serializable {
      **/
      **/
     private boolean openSort = true;
     private boolean openSort = true;
 
 
+    /**
+     * 优化 Count Sql 设置 false 执行 select count(1) from (listSql)
+     */
+    private boolean optimizeCountSql = true;
+
     /**
     /**
      * <p>
      * <p>
      * SQL 排序 ASC 集合
      * SQL 排序 ASC 集合
@@ -233,6 +238,15 @@ public class Pagination extends RowBounds implements Serializable {
         return this;
         return this;
     }
     }
 
 
+    @Transient
+    public boolean isOptimizeCountSql() {
+        return optimizeCountSql;
+    }
+
+    public void setOptimizeCountSql(boolean optimizeCountSql) {
+        this.optimizeCountSql = optimizeCountSql;
+    }
+
     @Transient
     @Transient
     public List<String> getAscs() {
     public List<String> getAscs() {
         return orders(isAsc, ascs);
         return orders(isAsc, ascs);

+ 8 - 2
mybatis-plus-support/src/main/java/com/baomidou/mybatisplus/plugins/parser/SqlInfo.java

@@ -25,8 +25,14 @@ package com.baomidou.mybatisplus.plugins.parser;
  */
  */
 public class SqlInfo {
 public class SqlInfo {
 
 
-    private String sql;// SQL 内容
-    private boolean orderBy = true;// 是否排序
+    /**
+     * SQL 内容
+     */
+    private String sql;
+    /**
+     * 是否排序
+     */
+    private boolean orderBy = true;
 
 
     public static SqlInfo newInstance() {
     public static SqlInfo newInstance() {
         return new SqlInfo();
         return new SqlInfo();

+ 19 - 4
mybatis-plus-support/src/main/java/com/baomidou/mybatisplus/toolkit/SqlUtils.java

@@ -34,7 +34,6 @@ import com.baomidou.mybatisplus.plugins.parser.SqlInfo;
 public class SqlUtils {
 public class SqlUtils {
 
 
     private final static SqlFormatter sqlFormatter = new SqlFormatter();
     private final static SqlFormatter sqlFormatter = new SqlFormatter();
-    public final static String SQL_BASE_COUNT = "SELECT COUNT(1) FROM ( %s ) TOTAL";
     public static ISqlParser COUNT_SQL_PARSER = null;
     public static ISqlParser COUNT_SQL_PARSER = null;
     private static Class<ISqlParser> DEFAULT_CLASS = null;
     private static Class<ISqlParser> DEFAULT_CLASS = null;
 
 
@@ -46,16 +45,32 @@ public class SqlUtils {
         }
         }
     }
     }
 
 
+    /**
+     * <p>
+     * 获取 COUNT 原生 SQL 包装
+     * </p>
+     * @param originalSql
+     * @return
+     */
+    public static String getOriginalCountSql(String originalSql) {
+        return String.format("SELECT COUNT(1) FROM ( %s ) TOTAL", originalSql);
+    }
+
+
     /**
     /**
      * <p>
      * <p>
      * 获取CountOptimize
      * 获取CountOptimize
      * </p>
      * </p>
      *
      *
-     * @param sqlParser   Count SQL 解析类
-     * @param originalSql 需要计算Count SQL
+     * @param optimizeCountSql 是否优化 Count SQL
+     * @param sqlParser        Count SQL 解析类
+     * @param originalSql      需要计算Count SQL
      * @return SqlInfo
      * @return SqlInfo
      */
      */
-    public static SqlInfo getCountOptimize(ISqlParser sqlParser, String originalSql) {
+    public static SqlInfo getOptimizeCountSql(boolean optimizeCountSql, ISqlParser sqlParser, String originalSql) {
+        if (!optimizeCountSql) {
+            return SqlInfo.newInstance().setSql(getOriginalCountSql(originalSql));
+        }
         // COUNT SQL 解析器
         // COUNT SQL 解析器
         if (null == COUNT_SQL_PARSER) {
         if (null == COUNT_SQL_PARSER) {
             if (null != sqlParser) {
             if (null != sqlParser) {