Browse Source

一波优化,解决上次喵神优化出来的 bug,字段填充可以在没有主键的情况下执行,用 lombok 优化了一下 PaginationInterceptor

miemie 7 years ago
parent
commit
e7e1aec28b

+ 22 - 22
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisDefaultParameterHandler.java

@@ -110,15 +110,12 @@ public class MybatisDefaultParameterHandler extends DefaultParameterHandler {
         }
         // 全局配置是否配置填充器
         MetaObjectHandler metaObjectHandler = GlobalConfigUtils.getMetaObjectHandler(ms.getConfiguration());
-        if (null == metaObjectHandler) {
-            return parameterObject;
-        }
         boolean isFill = false;
         /* 只处理插入或更新操作 */
         if (ms.getSqlCommandType() == SqlCommandType.INSERT) {
             isFill = true;
         } else if (ms.getSqlCommandType() == SqlCommandType.UPDATE
-            && metaObjectHandler.openUpdateFill()) {
+            && metaObjectHandler != null && metaObjectHandler.openUpdateFill()) {
             isFill = true;
         }
         if (isFill) {
@@ -207,33 +204,36 @@ public class MybatisDefaultParameterHandler extends DefaultParameterHandler {
      */
     protected static Object populateKeys(MetaObjectHandler metaObjectHandler, TableInfo tableInfo,
                                          MappedStatement ms, Object parameterObject) {
-        if (null == tableInfo || StringUtils.isEmpty(tableInfo.getKeyProperty()) || null == tableInfo.getIdType()) {
+        if (null == tableInfo) {
             /* 不处理 */
             return parameterObject;
         }
+        SqlCommandType sqlType = ms.getSqlCommandType();
         /* 自定义元对象填充控制器 */
         MetaObject metaObject = ms.getConfiguration().newMetaObject(parameterObject);
-        if (ms.getSqlCommandType() == SqlCommandType.INSERT) {
-            if (tableInfo.getIdType().getKey() >= 2) {
-                Object idValue = metaObject.getValue(tableInfo.getKeyProperty());
-                /* 自定义 ID */
-                if (StringUtils.checkValNull(idValue)) {
-                    if (tableInfo.getIdType() == IdType.ID_WORKER) {
-                        metaObject.setValue(tableInfo.getKeyProperty(), IdWorker.getId());
-                    } else if (tableInfo.getIdType() == IdType.ID_WORKER_STR) {
-                        metaObject.setValue(tableInfo.getKeyProperty(), IdWorker.getIdStr());
-                    } else if (tableInfo.getIdType() == IdType.UUID) {
-                        metaObject.setValue(tableInfo.getKeyProperty(), IdWorker.get32UUID());
-                    }
+        // 填充主键
+        if (sqlType == SqlCommandType.INSERT && !StringUtils.isEmpty(tableInfo.getKeyProperty())
+            && null != tableInfo.getIdType() && tableInfo.getIdType().getKey() >= 2) {
+            Object idValue = metaObject.getValue(tableInfo.getKeyProperty());
+            /* 自定义 ID */
+            if (StringUtils.checkValNull(idValue)) {
+                if (tableInfo.getIdType() == IdType.ID_WORKER) {
+                    metaObject.setValue(tableInfo.getKeyProperty(), IdWorker.getId());
+                } else if (tableInfo.getIdType() == IdType.ID_WORKER_STR) {
+                    metaObject.setValue(tableInfo.getKeyProperty(), IdWorker.getIdStr());
+                } else if (tableInfo.getIdType() == IdType.UUID) {
+                    metaObject.setValue(tableInfo.getKeyProperty(), IdWorker.get32UUID());
                 }
             }
-            // 插入填充
-            if (metaObjectHandler.openInsertFill()) {
+        }
+        if (metaObjectHandler != null) {
+            if (sqlType == SqlCommandType.INSERT && metaObjectHandler.openInsertFill()) {
+                // 插入填充
                 metaObjectHandler.insertFill(metaObject);
+            } else {
+                // 更新填充
+                metaObjectHandler.updateFill(metaObject);
             }
-        } else if (ms.getSqlCommandType() == SqlCommandType.UPDATE && metaObjectHandler.openUpdateFill()) {
-            // 更新填充
-            metaObjectHandler.updateFill(metaObject);
         }
         return metaObject.getOriginalObject();
     }

+ 44 - 64
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/PaginationInterceptor.java

@@ -53,6 +53,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.DialectFactory;
 import com.baomidou.mybatisplus.extension.plugins.pagination.PageHelper;
 import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
 
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
 /**
  * <p>
  * 分页拦截器
@@ -61,6 +64,8 @@ import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
  * @author hubin
  * @since 2016-01-23
  */
+@Setter
+@Accessors(chain = true)
 @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
 public class PaginationInterceptor extends AbstractSqlParserHandler implements Interceptor {
 
@@ -85,6 +90,45 @@ public class PaginationInterceptor extends AbstractSqlParserHandler implements I
      */
     private boolean localPage = false;
 
+    /**
+     * 查询SQL拼接Order By
+     *
+     * @param originalSql 需要拼接的SQL
+     * @param page        page对象
+     * @param orderBy     是否需要拼接Order By
+     * @return
+     */
+    public static String concatOrderBy(String originalSql, IPage page, boolean orderBy) {
+        if (orderBy && (ArrayUtils.isNotEmpty(page.ascs())
+            || ArrayUtils.isNotEmpty(page.descs()))) {
+            StringBuilder buildSql = new StringBuilder(originalSql);
+            String ascStr = concatOrderBuilder(page.ascs(), " ASC");
+            String descStr = concatOrderBuilder(page.descs(), " DESC");
+            if (StringUtils.isNotEmpty(ascStr) && StringUtils.isNotEmpty(descStr)) {
+                ascStr += ", ";
+            }
+            if (StringUtils.isNotEmpty(ascStr) || StringUtils.isNotEmpty(descStr)) {
+                buildSql.append(" ORDER BY ").append(ascStr).append(descStr);
+            }
+            return buildSql.toString();
+        }
+        return originalSql;
+    }
+
+    /**
+     * 拼接多个排序方法
+     *
+     * @param columns
+     * @param orderWord
+     */
+    private static String concatOrderBuilder(String[] columns, String orderWord) {
+        if (ArrayUtils.isNotEmpty(columns)) {
+            return Arrays.stream(columns).filter(c -> StringUtils.isNotEmpty(c))
+                .collect(joining(",", "", orderWord));
+        }
+        return StringUtils.EMPTY;
+    }
+
     /**
      * Physical Page Interceptor for all the queries with parameter {@link RowBounds}
      */
@@ -161,45 +205,6 @@ public class PaginationInterceptor extends AbstractSqlParserHandler implements I
         return invocation.proceed();
     }
 
-    /**
-     * 查询SQL拼接Order By
-     *
-     * @param originalSql 需要拼接的SQL
-     * @param page        page对象
-     * @param orderBy     是否需要拼接Order By
-     * @return
-     */
-    public static String concatOrderBy(String originalSql, IPage page, boolean orderBy) {
-        if (orderBy && (ArrayUtils.isNotEmpty(page.ascs())
-            || ArrayUtils.isNotEmpty(page.descs()))) {
-            StringBuilder buildSql = new StringBuilder(originalSql);
-            String ascStr = concatOrderBuilder(page.ascs(), " ASC");
-            String descStr = concatOrderBuilder(page.descs(), " DESC");
-            if (StringUtils.isNotEmpty(ascStr) && StringUtils.isNotEmpty(descStr)) {
-                ascStr += ", ";
-            }
-            if (StringUtils.isNotEmpty(ascStr) || StringUtils.isNotEmpty(descStr)) {
-                buildSql.append(" ORDER BY ").append(ascStr).append(descStr);
-            }
-            return buildSql.toString();
-        }
-        return originalSql;
-    }
-
-    /**
-     * 拼接多个排序方法
-     *
-     * @param columns
-     * @param orderWord
-     */
-    private static String concatOrderBuilder(String[] columns, String orderWord) {
-        if (ArrayUtils.isNotEmpty(columns)) {
-            return Arrays.stream(columns).filter(c -> StringUtils.isNotEmpty(c))
-                .collect(joining(",", "", orderWord));
-        }
-        return StringUtils.EMPTY;
-    }
-
     /**
      * 查询总记录条数
      *
@@ -256,29 +261,4 @@ public class PaginationInterceptor extends AbstractSqlParserHandler implements I
             this.localPage = Boolean.valueOf(localPage);
         }
     }
-
-    public PaginationInterceptor setDialectType(String dialectType) {
-        this.dialectType = dialectType;
-        return this;
-    }
-
-    public PaginationInterceptor setDialectClazz(String dialectClazz) {
-        this.dialectClazz = dialectClazz;
-        return this;
-    }
-
-    public PaginationInterceptor setOverflow(boolean overflow) {
-        this.overflow = overflow;
-        return this;
-    }
-
-    public PaginationInterceptor setSqlParser(ISqlParser sqlParser) {
-        this.sqlParser = sqlParser;
-        return this;
-    }
-
-    public PaginationInterceptor setLocalPage(boolean localPage) {
-        this.localPage = localPage;
-        return this;
-    }
 }