nieqiurong před 4 roky
rodič
revize
d75d562cb6
13 změnil soubory, kde provedl 288 přidání a 100 odebrání
  1. 27 12
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/PackageConfig.java
  2. 1 41
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/TemplateConfig.java
  3. 42 24
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/builder/ConfigBuilder.java
  4. 87 0
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/builder/PathInfoHandler.java
  5. 6 0
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/po/TableField.java
  6. 8 11
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/po/TableInfo.java
  7. 25 2
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/querys/DecoratorDbQuery.java
  8. 2 0
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/rules/NamingStrategy.java
  9. 5 5
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/engine/AbstractTemplateEngine.java
  10. 5 4
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/keywords/BaseKeyWordsHandler.java
  11. 19 0
      mybatis-plus-generator/src/test/java/com/baomidou/mybatisplus/generator/config/PackageConfigTest.java
  12. 60 0
      mybatis-plus-generator/src/test/java/com/baomidou/mybatisplus/generator/config/builder/ConfigBuilderTest.java
  13. 1 1
      mybatis-plus-generator/src/test/java/com/baomidou/mybatisplus/test/generator/H2CodeGeneratorTest.java

+ 27 - 12
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/PackageConfig.java

@@ -16,12 +16,13 @@
 package com.baomidou.mybatisplus.generator.config;
 
 
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -72,6 +73,13 @@ public class PackageConfig {
      */
     private Map<String, String> pathInfo;
 
+    /**
+     * 包配置信息
+     *
+     * @since 3.4.1
+     */
+    private final Map<String, String> packageInfo = new HashMap<>();
+
     /**
      * 父包名
      */
@@ -89,20 +97,27 @@ public class PackageConfig {
      * @return 连接后的包名
      */
     public String joinPackage(String subPackage) {
+        String parent = getParent();
         return StringUtils.isBlank(parent) ? subPackage : (parent + StringPool.DOT + subPackage);
     }
 
-    public Map<String, String> initPackageInfo() {
-        Map<String, String> initMap = CollectionUtils.newHashMapWithExpectedSize(7);
-        initMap.put(ConstVal.MODULE_NAME, this.getModuleName());
-        initMap.put(ConstVal.ENTITY, this.joinPackage(this.getEntity()));
-        initMap.put(ConstVal.MAPPER, this.joinPackage(this.getMapper()));
-        initMap.put(ConstVal.XML, this.joinPackage(this.getXml()));
-        initMap.put(ConstVal.SERVICE, this.joinPackage(this.getService()));
-        initMap.put(ConstVal.SERVICE_IMPL, this.joinPackage(this.getServiceImpl()));
-        initMap.put(ConstVal.CONTROLLER, this.joinPackage(this.getController()));
-        return initMap;
+    /**
+     * 获取包配置信息
+     *
+     * @return 包配置信息
+     * @since 3.4.1
+     */
+    public Map<String, String> getPackageInfo() {
+        if (packageInfo.isEmpty()) {
+            packageInfo.put(ConstVal.MODULE_NAME, this.getModuleName());
+            packageInfo.put(ConstVal.ENTITY, this.joinPackage(this.getEntity()));
+            packageInfo.put(ConstVal.MAPPER, this.joinPackage(this.getMapper()));
+            packageInfo.put(ConstVal.XML, this.joinPackage(this.getXml()));
+            packageInfo.put(ConstVal.SERVICE, this.joinPackage(this.getService()));
+            packageInfo.put(ConstVal.SERVICE_IMPL, this.joinPackage(this.getServiceImpl()));
+            packageInfo.put(ConstVal.CONTROLLER, this.joinPackage(this.getController()));
+        }
+        return Collections.unmodifiableMap(this.packageInfo);
     }
 
-
 }

+ 1 - 41
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/TemplateConfig.java

@@ -15,16 +15,11 @@
  */
 package com.baomidou.mybatisplus.generator.config;
 
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import lombok.AccessLevel;
 import lombok.Data;
 import lombok.Getter;
 import lombok.experimental.Accessors;
 
-import java.io.File;
-import java.util.Map;
 
 /**
  * 模板路径配置项
@@ -81,46 +76,11 @@ public class TemplateConfig {
                     case CONTROLLER:
                         setController(null);
                         break;
+                    default:
                 }
             }
         }
         return this;
     }
 
-    public Map<String, String> getPathInfo(GlobalConfig globalConfig, Map<String, String> packageInfo) {
-        Map<String, String> initMap = CollectionUtils.newHashMapWithExpectedSize(6);
-        String outputDir = globalConfig.getOutputDir();
-        setPathInfo(initMap, packageInfo, this.getEntity(globalConfig.isKotlin()), outputDir, ConstVal.ENTITY_PATH, ConstVal.ENTITY);
-        setPathInfo(initMap, packageInfo, this.getMapper(), outputDir, ConstVal.MAPPER_PATH, ConstVal.MAPPER);
-        setPathInfo(initMap, packageInfo, this.getXml(), outputDir, ConstVal.XML_PATH, ConstVal.XML);
-        setPathInfo(initMap, packageInfo, this.getService(), outputDir, ConstVal.SERVICE_PATH, ConstVal.SERVICE);
-        setPathInfo(initMap, packageInfo, this.getServiceImpl(), outputDir, ConstVal.SERVICE_IMPL_PATH, ConstVal.SERVICE_IMPL);
-        setPathInfo(initMap, packageInfo, this.getController(), outputDir, ConstVal.CONTROLLER_PATH, ConstVal.CONTROLLER);
-        return initMap;
-    }
-
-    private void setPathInfo(Map<String, String> pathInfo, Map<String, String> packageInfo, String template, String outputDir, String path, String module) {
-        if (StringUtils.isNotBlank(template)) {
-            pathInfo.put(path, joinPath(outputDir, packageInfo.get(module)));
-        }
-    }
-
-    /**
-     * 连接路径字符串
-     *
-     * @param parentDir   路径常量字符串
-     * @param packageName 包名
-     * @return 连接后的路径
-     */
-    private String joinPath(String parentDir, String packageName) {
-        if (StringUtils.isBlank(parentDir)) {
-            parentDir = System.getProperty(ConstVal.JAVA_TMPDIR);
-        }
-        if (!StringUtils.endsWith(parentDir, File.separator)) {
-            parentDir += File.separator;
-        }
-        packageName = packageName.replaceAll("\\.", StringPool.BACK_SLASH + File.separator);
-        return parentDir + packageName;
-    }
-
 }

+ 42 - 24
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/builder/ConfigBuilder.java

@@ -29,6 +29,8 @@ import lombok.Data;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.experimental.Accessors;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.sql.SQLException;
 import java.util.*;
@@ -45,6 +47,8 @@ import java.util.stream.Collectors;
 @Accessors(chain = true)
 public class ConfigBuilder {
 
+    private final static Logger LOGGER = LoggerFactory.getLogger(ConfigBuilder.class);
+
     /**
      * 模板路径配置信息
      */
@@ -60,11 +64,6 @@ public class ConfigBuilder {
      * 数据库表信息
      */
     private final List<TableInfo> tableInfoList = new ArrayList<>();
-    /**
-     * 包配置详情
-     */
-    @Setter(value = AccessLevel.NONE)
-    private final Map<String, String> packageInfo = new HashMap<>();
     /**
      * 路径配置信息
      */
@@ -85,11 +84,15 @@ public class ConfigBuilder {
     /**
      * 过滤正则
      */
-    private static final Pattern REGX = Pattern.compile("[~!/@#$%^&*()-=+\\\\|{};:'\",<.>?]+");
+    private static final Pattern REGX = Pattern.compile("[~!/@#$%^&*()+\\\\\\[\\]|{};:'\",<.>?]+");
     /**
      * 表数据查询
      */
     private final DecoratorDbQuery dbQuery;
+    /**
+     * 包配置信息
+     */
+    private final PackageConfig packageConfig;
 
     /**
      * 在构造器中处理配置
@@ -109,9 +112,8 @@ public class ConfigBuilder {
         this.dbQuery = new DecoratorDbQuery(dataSourceConfig.getDbQuery(), dataSourceConfig, strategyConfig);
         this.globalConfig = Optional.ofNullable(globalConfig).orElseGet(GlobalConfig::new);
         this.template = Optional.ofNullable(template).orElseGet(TemplateConfig::new);
-        packageConfig = Optional.ofNullable(packageConfig).orElseGet(PackageConfig::new);
-        this.packageInfo.putAll(packageConfig.initPackageInfo());
-        this.pathInfo.putAll(Optional.ofNullable(packageConfig.getPathInfo()).orElseGet(() -> this.template.getPathInfo(this.globalConfig, packageInfo)));
+        this.packageConfig = Optional.ofNullable(packageConfig).orElseGet(PackageConfig::new);
+        this.pathInfo.putAll(new PathInfoHandler(this.globalConfig, this.template, this.packageConfig).getPathInfo());
         this.tableInfoList.addAll(getTablesInfo());
     }
 
@@ -148,8 +150,10 @@ public class ConfigBuilder {
             });
             //TODO 我要把这个打印不存在表的功能和正则匹配功能删掉,就算是苗老板来了也拦不住的那种
             if (isExclude || isInclude) {
-                Set<String> notExistTables = new HashSet<>(isExclude ? strategyConfig.getExclude() : strategyConfig.getInclude())
-                    .stream().filter(s -> !REGX.matcher(s).find()).map(String::toLowerCase).collect(Collectors.toSet());
+                Map<String, String> notExistTables = new HashSet<>(isExclude ? strategyConfig.getExclude() : strategyConfig.getInclude())
+                    .stream()
+                    .filter(s -> !matcherRegTable(s))
+                    .collect(Collectors.toMap(String::toLowerCase, s -> s, (o, n) -> n));
                 // 将已经存在的表移除,获取配置中数据库不存在的表
                 for (TableInfo tabInfo : tableList) {
                     if (notExistTables.isEmpty()) {
@@ -159,7 +163,7 @@ public class ConfigBuilder {
                     notExistTables.remove(tabInfo.getName().toLowerCase());
                 }
                 if (notExistTables.size() > 0) {
-                    System.err.println("表 " + notExistTables + " 在数据库中不存在!!!");
+                    LOGGER.warn("表[{}]在数据库中不存在!!!", String.join(StringPool.COMMA, notExistTables.values()));
                 }
                 // 需要反向生成的表信息
                 if (isExclude) {
@@ -202,17 +206,7 @@ public class ConfigBuilder {
                 TableField field = new TableField();
                 String columnName = result.getStringResult(dbQuery.fieldName());
                 // 避免多重主键设置,目前只取第一个找到ID,并放到list中的索引为0的位置
-                boolean isId;
-                if (DbType.H2 == dbType) {
-                    isId = h2PkColumns.contains(columnName);
-                } else {
-                    String key = result.getStringResult(dbQuery.fieldKey());
-                    if (DbType.DB2 == dbType || DbType.SQLITE == dbType) {
-                        isId = StringUtils.isNotBlank(key) && "1".equals(key);
-                    } else {
-                        isId = StringUtils.isNotBlank(key) && "PRI".equals(key.toUpperCase());
-                    }
-                }
+                boolean isId = DbType.H2 == dbType ? h2PkColumns.contains(columnName) : result.isPrimaryKey();
                 // 处理ID
                 if (isId) {
                     field.setKeyFlag(true).setKeyIdentityFlag(dbQuery.isKeyIdentity(result.getResultSet()));
@@ -221,7 +215,7 @@ public class ConfigBuilder {
                 String newColumnName = columnName;
                 IKeyWordsHandler keyWordsHandler = dataSourceConfig.getKeyWordsHandler();
                 if (keyWordsHandler != null && keyWordsHandler.isKeyWords(columnName)) {
-                    System.err.printf("当前表[%s]存在字段[%s]为数据库关键字或保留字!%n", tableName, columnName);
+                    LOGGER.warn("当前表[{}]存在字段[{}]为数据库关键字或保留字!", tableName, columnName);
                     field.setKeyWords(true);
                     newColumnName = keyWordsHandler.formatColumn(columnName);
                 }
@@ -283,4 +277,28 @@ public class ConfigBuilder {
         this.tableInfoList.addAll(tableInfoList);
         return this;
     }
+
+    /**
+     * 判断表名是否为正则表名(这表名规范比较随意,只能尽量匹配上特殊符号)
+     *
+     * @param tableName 表名
+     * @return 是否正则
+     * @since 3.4.1
+     */
+    public static boolean matcherRegTable(String tableName) {
+        return REGX.matcher(tableName).find();
+    }
+
+    /**
+     * 获取包配置信息
+     *
+     * @return 包配置信息
+     * @see PackageConfig#getPackageInfo()
+     * @deprecated 3.4.1
+     */
+    @Deprecated
+    public Map<String, String> getPackageInfo() {
+        return packageConfig.getPackageInfo();
+    }
+
 }

+ 87 - 0
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/builder/PathInfoHandler.java

@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2011-2020, baomidou (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>
+ * https://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.generator.config.builder;
+
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.generator.config.ConstVal;
+import com.baomidou.mybatisplus.generator.config.GlobalConfig;
+import com.baomidou.mybatisplus.generator.config.PackageConfig;
+import com.baomidou.mybatisplus.generator.config.TemplateConfig;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 路径信息处理
+ *
+ * @author nieqiurong 2020/10/6.
+ * @since 3.4.1
+ */
+class PathInfoHandler {
+
+    private final Map<String, String> pathInfo = new HashMap<>();
+
+    private final String outputDir;
+
+    private final Map<String, String> packageInfo;
+
+
+    PathInfoHandler(GlobalConfig globalConfig, TemplateConfig templateConfig, PackageConfig packageConfig) {
+        this.outputDir = globalConfig.getOutputDir();
+        this.packageInfo = packageConfig.getPackageInfo();
+        Map<String, String> pathInfo = packageConfig.getPathInfo();
+        if (CollectionUtils.isNotEmpty(pathInfo)) {
+            this.pathInfo.putAll(pathInfo);
+        } else {
+            putPathInfo(templateConfig.getEntity(globalConfig.isKotlin()), ConstVal.ENTITY_PATH, ConstVal.ENTITY);
+            putPathInfo(templateConfig.getMapper(), ConstVal.MAPPER_PATH, ConstVal.MAPPER);
+            putPathInfo(templateConfig.getXml(), ConstVal.XML_PATH, ConstVal.XML);
+            putPathInfo(templateConfig.getService(), ConstVal.SERVICE_PATH, ConstVal.SERVICE);
+            putPathInfo(templateConfig.getServiceImpl(), ConstVal.SERVICE_IMPL_PATH, ConstVal.SERVICE_IMPL);
+            putPathInfo(templateConfig.getController(), ConstVal.CONTROLLER_PATH, ConstVal.CONTROLLER);
+        }
+    }
+
+    public Map<String, String> getPathInfo() {
+        return Collections.unmodifiableMap(this.pathInfo);
+    }
+
+    private void putPathInfo(String template, String path, String module) {
+        if (StringUtils.isNotBlank(template)) pathInfo.put(path, joinPath(outputDir, packageInfo.get(module)));
+    }
+
+    /**
+     * 连接路径字符串
+     *
+     * @param parentDir   路径常量字符串
+     * @param packageName 包名
+     * @return 连接后的路径
+     */
+    private String joinPath(String parentDir, String packageName) {
+        if (StringUtils.isBlank(parentDir)) {
+            parentDir = System.getProperty(ConstVal.JAVA_TMPDIR);
+        }
+        if (!StringUtils.endsWith(parentDir, File.separator)) {
+            parentDir += File.separator;
+        }
+        packageName = packageName.replaceAll("\\.", StringPool.BACK_SLASH + File.separator);
+        return parentDir + packageName;
+    }
+}

+ 6 - 0
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/po/TableField.java

@@ -62,6 +62,12 @@ public class TableField {
      */
     private Map<String, Object> customMap;
 
+    /**
+     * @param convert
+     * @return this
+     * @see #setConvert(StrategyConfig)
+     * @deprecated 3.4.1
+     */
     public TableField setConvert(boolean convert) {
         this.convert = convert;
         return this;

+ 8 - 11
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/po/TableInfo.java

@@ -84,20 +84,17 @@ public class TableInfo {
         if (strategyConfig.startsWithTablePrefix(name) || strategyConfig.isEntityTableFieldAnnotationEnable()) {
             // 包含前缀
             this.convert = true;
-        } else if (strategyConfig.isCapitalModeNaming(name)) {
-            // 包含
-            this.convert = !entityName.equalsIgnoreCase(name);
-        } else {
-            // 转换字段
-            if (NamingStrategy.underline_to_camel == strategyConfig.getColumnNaming()) {
-                // 包含大写处理
-                if (StringUtils.containsUpperCase(name)) {
-                    this.convert = true;
-                }
-            } else if (!entityName.equalsIgnoreCase(name)) {
+            return this;
+        }
+        // 转换字段
+        if (NamingStrategy.underline_to_camel == strategyConfig.getColumnNaming()) {
+            // 包含大写处理
+            if (StringUtils.containsUpperCase(name)) {
                 this.convert = true;
             }
+            return this;
         }
+        this.convert = !entityName.equalsIgnoreCase(name);
         return this;
     }
 

+ 25 - 2
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/querys/DecoratorDbQuery.java

@@ -22,6 +22,8 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
 import com.baomidou.mybatisplus.generator.config.IDbQuery;
 import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
@@ -46,6 +48,7 @@ public class DecoratorDbQuery extends AbstractDbQuery {
     private final DbType dbType;
     private final StrategyConfig strategyConfig;
     private final String schema;
+    private final Logger logger;
 
     public DecoratorDbQuery(IDbQuery dbQuery, DataSourceConfig dataSourceConfig, StrategyConfig strategyConfig) {
         this.dbQuery = dbQuery;
@@ -53,6 +56,7 @@ public class DecoratorDbQuery extends AbstractDbQuery {
         this.dbType = dataSourceConfig.getDbType();
         this.strategyConfig = strategyConfig;
         this.schema = dataSourceConfig.getSchemaName();
+        this.logger = LoggerFactory.getLogger(dbQuery.getClass());
     }
 
     @Override
@@ -144,6 +148,7 @@ public class DecoratorDbQuery extends AbstractDbQuery {
         try {
             return dbQuery.isKeyIdentity(results);
         } catch (SQLException e) {
+            logger.warn("判断主键自增错误:{}", e.getMessage());
             // ignore 这个看到在查H2的时候出了异常,先忽略这个异常了.
         }
         return false;
@@ -171,11 +176,17 @@ public class DecoratorDbQuery extends AbstractDbQuery {
     }
 
     public void query(String sql, Consumer<ResultSetWrapper> consumer) throws SQLException {
+        logger.debug("执行SQL:{}", sql);
+        int count = 0;
+        long start = System.nanoTime();
         try (PreparedStatement preparedStatement = connection.prepareStatement(sql);
              ResultSet resultSet = preparedStatement.executeQuery()) {
             while (resultSet.next()) {
-                consumer.accept(new ResultSetWrapper(resultSet, this));
+                consumer.accept(new ResultSetWrapper(resultSet, this, this.dbType));
+                count++;
             }
+            long end = System.nanoTime();
+            logger.info("返回记录数:{},耗时(ms):{}", count, (end - start) / 1000000);
         }
     }
 
@@ -199,9 +210,12 @@ public class DecoratorDbQuery extends AbstractDbQuery {
 
         private final ResultSet resultSet;
 
-        ResultSetWrapper(ResultSet resultSet, IDbQuery dbQuery) {
+        private final DbType dbType;
+
+        ResultSetWrapper(ResultSet resultSet, IDbQuery dbQuery, DbType dbType) {
             this.resultSet = resultSet;
             this.dbQuery = dbQuery;
+            this.dbType = dbType;
         }
 
         public ResultSet getResultSet() {
@@ -232,5 +246,14 @@ public class DecoratorDbQuery extends AbstractDbQuery {
         public String formatComment(String comment) {
             return StringUtils.isBlank(comment) ? StringPool.EMPTY : comment.replaceAll("\r\n", "\t");
         }
+
+        public boolean isPrimaryKey() {
+            String key = this.getStringResult(dbQuery.fieldKey());
+            if (DbType.DB2 == dbType || DbType.SQLITE == dbType) {
+                return StringUtils.isNotBlank(key) && "1".equals(key);
+            } else {
+                return StringUtils.isNotBlank(key) && "PRI".equals(key.toUpperCase());
+            }
+        }
     }
 }

+ 2 - 0
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/rules/NamingStrategy.java

@@ -102,7 +102,9 @@ public enum NamingStrategy {
      * @param name   ignore
      * @param prefix ignore
      * @return ignore
+     * @deprecated 3.4.1
      */
+    @Deprecated
     public static boolean isPrefixContained(String name, String... prefix) {
         if (null == prefix || StringUtils.isBlank(name)) {
             return false;

+ 5 - 5
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/engine/AbstractTemplateEngine.java

@@ -66,12 +66,12 @@ public abstract class AbstractTemplateEngine {
     public AbstractTemplateEngine batchOutput() {
         try {
             List<TableInfo> tableInfoList = getConfigBuilder().getTableInfoList();
+            Map<String, String> pathInfo = getConfigBuilder().getPathInfo();
+            TemplateConfig template = getConfigBuilder().getTemplate();
+            // 自定义内容
+            InjectionConfig injectionConfig = getConfigBuilder().getInjectionConfig();
             for (TableInfo tableInfo : tableInfoList) {
                 Map<String, Object> objectMap = getObjectMap(tableInfo);
-                Map<String, String> pathInfo = getConfigBuilder().getPathInfo();
-                TemplateConfig template = getConfigBuilder().getTemplate();
-                // 自定义内容
-                InjectionConfig injectionConfig = getConfigBuilder().getInjectionConfig();
                 if (null != injectionConfig) {
                     injectionConfig.initTableMap(tableInfo);
                     objectMap.put("cfg", injectionConfig.getMap());
@@ -207,7 +207,7 @@ public abstract class AbstractTemplateEngine {
         }
         objectMap.put("restControllerStyle", config.getStrategyConfig().isRestControllerStyle());
         objectMap.put("config", config);
-        objectMap.put("package", config.getPackageInfo());
+        objectMap.put("package", config.getPackageConfig().getPackageInfo());
         GlobalConfig globalConfig = config.getGlobalConfig();
         objectMap.put("author", globalConfig.getAuthor());
         objectMap.put("idType", globalConfig.getIdType() == null ? null : globalConfig.getIdType().toString());

+ 5 - 4
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/keywords/BaseKeyWordsHandler.java

@@ -27,18 +27,19 @@ import java.util.Locale;
  * @since 3.3.2
  */
 public abstract class BaseKeyWordsHandler implements IKeyWordsHandler {
-    
+
     public List<String> keyWords;
-    
+
     public BaseKeyWordsHandler(List<String> keyWords) {
         this.keyWords = keyWords;
     }
-    
+
     @Override
     public List<String> getKeyWords() {
         return keyWords;
     }
-    
+
+    @Override
     public boolean isKeyWords(String columnName) {
         return getKeyWords().contains(columnName.toUpperCase(Locale.ENGLISH));
     }

+ 19 - 0
mybatis-plus-generator/src/test/java/com/baomidou/mybatisplus/generator/config/PackageConfigTest.java

@@ -0,0 +1,19 @@
+package com.baomidou.mybatisplus.generator.config;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author nieqiurong 2020/10/6.
+ */
+public class PackageConfigTest {
+
+    @Test
+    void joinPackageTest() {
+        Assertions.assertEquals("com.baomidou.demo", new PackageConfig().joinPackage("demo"));
+        Assertions.assertEquals("com.baomidou.mp.demo", new PackageConfig().setModuleName("mp").joinPackage("demo"));
+        Assertions.assertEquals("com.baomihua.demo", new PackageConfig().setParent("com.baomihua").joinPackage("demo"));
+        Assertions.assertEquals("com.baomihua.mp.demo", new PackageConfig().setParent("com.baomihua").setModuleName("mp").joinPackage("demo"));
+    }
+
+}

+ 60 - 0
mybatis-plus-generator/src/test/java/com/baomidou/mybatisplus/generator/config/builder/ConfigBuilderTest.java

@@ -0,0 +1,60 @@
+package com.baomidou.mybatisplus.generator.config.builder;
+
+import com.baomidou.mybatisplus.generator.config.ConstVal;
+import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.PackageConfig;
+import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.TemplateConfig;
+import org.h2.Driver;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * @author nieqiurong 2020/10/6.
+ */
+public class ConfigBuilderTest {
+
+    private static final DataSourceConfig DATA_SOURCE_CONFIG = new DataSourceConfig()
+        .setUrl("jdbc:h2:mem:test;MODE=mysql;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE").setDriverName(Driver.class.getName()).setUsername("sa").setPassword("");
+
+    @Test
+    void matcherRegTableTest(){
+        Assertions.assertFalse(ConfigBuilder.matcherRegTable("user"));
+        Assertions.assertFalse(ConfigBuilder.matcherRegTable("USER"));
+        Assertions.assertFalse(ConfigBuilder.matcherRegTable("t_user"));
+        Assertions.assertFalse(ConfigBuilder.matcherRegTable("T_USER"));
+        Assertions.assertFalse(ConfigBuilder.matcherRegTable("t_user_1"));
+        Assertions.assertFalse(ConfigBuilder.matcherRegTable("t_user_12"));
+        Assertions.assertFalse(ConfigBuilder.matcherRegTable("t-user-12"));
+        Assertions.assertTrue(ConfigBuilder.matcherRegTable("t_user_[0-9]"));
+        Assertions.assertTrue(ConfigBuilder.matcherRegTable("t_user_\\d"));
+        Assertions.assertTrue(ConfigBuilder.matcherRegTable("t_user_\\d{3,4}"));
+        Assertions.assertTrue(ConfigBuilder.matcherRegTable("^t_.*"));
+    }
+
+    @Test
+    void pathInfoTest() {
+        ConfigBuilder configBuilder;
+        Map<String, String> pathInfo;
+        configBuilder = new ConfigBuilder(new PackageConfig(), DATA_SOURCE_CONFIG, new StrategyConfig(), new TemplateConfig(), null);
+        pathInfo = configBuilder.getPathInfo();
+        Assertions.assertFalse(pathInfo.isEmpty());
+        Assertions.assertEquals(6, pathInfo.size());
+        Assertions.assertTrue(pathInfo.containsKey(ConstVal.ENTITY_PATH));
+        Assertions.assertTrue(pathInfo.containsKey(ConstVal.CONTROLLER_PATH));
+        Assertions.assertTrue(pathInfo.containsKey(ConstVal.SERVICE_PATH));
+        Assertions.assertTrue(pathInfo.containsKey(ConstVal.SERVICE_IMPL_PATH));
+        Assertions.assertTrue(pathInfo.containsKey(ConstVal.XML_PATH));
+        Assertions.assertTrue(pathInfo.containsKey(ConstVal.MAPPER_PATH));
+
+        configBuilder = new ConfigBuilder(
+            new PackageConfig().setPathInfo(Collections.singletonMap(ConstVal.ENTITY_PATH, "/tmp/code/entity")), DATA_SOURCE_CONFIG, new StrategyConfig(), new TemplateConfig(), null);
+        pathInfo = configBuilder.getPathInfo();
+        Assertions.assertFalse(pathInfo.isEmpty());
+        Assertions.assertEquals(1, pathInfo.size());
+        Assertions.assertTrue(pathInfo.containsKey(ConstVal.ENTITY_PATH));
+    }
+}

+ 1 - 1
mybatis-plus-generator/src/test/java/com/baomidou/mybatisplus/test/generator/H2CodeGeneratorTest.java

@@ -18,7 +18,7 @@ import org.junit.jupiter.api.Test;
  */
 class H2CodeGeneratorTest {
 
-    private static String outPutDir = System.getProperty("os.name").toLowerCase().contains("windows") ? "D://tmp" : "/tmp";
+    private static final String outPutDir = System.getProperty("os.name").toLowerCase().contains("windows") ? "D://tmp" : "/tmp";
 
     private DataSourceConfig dataSourceConfig() {
         String dbUrl = "jdbc:h2:mem:test;MODE=mysql;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE";