Browse Source

mybatis自动生成工具调整

songxinlu 4 years ago
parent
commit
c305940c6a

+ 39 - 0
security-center/src/main/resources/freemarker/baseMapper.xml.ftl

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="${package.Mapper}.${table.mapperName}">
+
+<#if enableCache>
+    <!-- 开启二级缓存 -->
+    <cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>
+
+</#if>
+<#if baseResultMap>
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="${package.Entity}.${entity}">
+<#list table.fields as field>
+<#if field.keyFlag><#--生成主键排在第一位-->
+        <id column="${field.name}" property="${field.propertyName}" />
+</#if>
+</#list>
+<#list table.commonFields as field><#--生成公共字段 -->
+    <result column="${field.name}" property="${field.propertyName}" />
+</#list>
+<#list table.fields as field>
+<#if !field.keyFlag><#--生成普通字段 -->
+        <result column="${field.name}" property="${field.propertyName}" />
+</#if>
+</#list>
+    </resultMap>
+
+</#if>
+<#if baseColumnList>
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+<#list table.commonFields as field>
+        ${field.name},
+</#list>
+        ${table.fieldNames}
+    </sql>
+
+</#if>
+</mapper>

+ 1 - 1
security-center/src/main/resources/freemarker/controller.java.ftl

@@ -17,7 +17,7 @@ import ${superControllerClassPackage};
  * ${table.comment!} 前端控制器
  * </p>
  *
- * @author ${author}
+ <#--* @author ${author}-->
  <#--* @since ${date}-->
  */
 <#if restControllerStyle>

+ 7 - 7
security-center/src/main/resources/freemarker/entity.java.ftl

@@ -9,7 +9,7 @@ import io.swagger.annotations.ApiModelProperty;
 </#if>
 <#if entityLombokModel>
 import lombok.Data;
-import lombok.EqualsAndHashCode;
+<#--import lombok.EqualsAndHashCode;-->
 import lombok.experimental.Accessors;
 </#if>
 
@@ -18,16 +18,16 @@ import lombok.experimental.Accessors;
  * ${table.comment!}
  * </p>
  *
- * @author ${author}
+ <#--* @author ${author}-->
  <#--* @since ${date}-->
  */
 <#if entityLombokModel>
 @Data
-    <#if superEntityClass??>
-@EqualsAndHashCode(callSuper = true)
-    <#else>
-@EqualsAndHashCode(callSuper = false)
-    </#if>
+    <#--<#if superEntityClass??>-->
+<#--@EqualsAndHashCode(callSuper = true)-->
+    <#--<#else>-->
+<#--@EqualsAndHashCode(callSuper = false)-->
+    <#--</#if>-->
 @Accessors(chain = true)
 </#if>
 <#if table.convert>

+ 1 - 1
security-center/src/main/resources/freemarker/facade.java.ftl

@@ -7,7 +7,7 @@ import org.springframework.stereotype.Component;
  * ${table.comment!} 服务实现类Facade
  * </p>
  *
- * @author ${author}
+ <#--* @author ${author}-->
  <#--* @since ${date}-->
  */
 @Component

+ 6 - 5
security-center/src/main/resources/freemarker/mapper.java.ftl

@@ -1,19 +1,20 @@
 package ${package.Mapper};
 
-import ${package.Mapper}.parent.${table.mapperName}Parent;
+import ${package.Entity}.${entity};
+import ${superMapperClassPackage};
 
 /**
  * <p>
-    * ${table.comment!} Mapper 接口
-    * </p>
+ * ${table.comment!} Mapper 接口
+ * </p>
  *
- * @author ${author}
+<#--* @author ${author}-->
 <#--* @since ${date}-->
  */
 <#if kotlin>
 interface ${table.mapperName} : ${superMapperClass}<${entity}>
 <#else>
-public interface ${table.mapperName} extends ${table.mapperName}Parent {
+public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {
 
 }
 </#if>

+ 18 - 18
security-center/src/main/resources/freemarker/mapper.xml.ftl

@@ -7,25 +7,25 @@
     <cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>
 
 </#if>
-<#if baseResultMap>
-    <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="${package.Entity}.${entity}">
-<#list table.fields as field>
-<#if field.keyFlag><#--生成主键排在第一位-->
-        <id column="${field.name}" property="${field.propertyName}" />
-</#if>
-</#list>
-<#list table.commonFields as field><#--生成公共字段 -->
-    <result column="${field.name}" property="${field.propertyName}" />
-</#list>
-<#list table.fields as field>
-<#if !field.keyFlag><#--生成普通字段 -->
-        <result column="${field.name}" property="${field.propertyName}" />
-</#if>
-</#list>
-    </resultMap>
+<#--<#if baseResultMap>-->
+    <#--<!-- 通用查询映射结果 &ndash;&gt;-->
+    <#--<resultMap id="BaseResultMap" type="${package.Entity}.${entity}">-->
+<#--<#list table.fields as field>-->
+<#--<#if field.keyFlag>&lt;#&ndash;生成主键排在第一位&ndash;&gt;-->
+        <#--<id column="${field.name}" property="${field.propertyName}" />-->
+<#--</#if>-->
+<#--</#list>-->
+<#--<#list table.commonFields as field>&lt;#&ndash;生成公共字段 &ndash;&gt;-->
+    <#--<result column="${field.name}" property="${field.propertyName}" />-->
+<#--</#list>-->
+<#--<#list table.fields as field>-->
+<#--<#if !field.keyFlag>&lt;#&ndash;生成普通字段 &ndash;&gt;-->
+        <#--<result column="${field.name}" property="${field.propertyName}" />-->
+<#--</#if>-->
+<#--</#list>-->
+    <#--</resultMap>-->
 
-</#if>
+<#--</#if>-->
 <#if baseColumnList>
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">

+ 0 - 39
security-center/src/main/resources/freemarker/mapperExt.xml.ftl

@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="${package.Mapper}.${table.mapperName}">
-
-<#if enableCache>
-    <!-- 开启二级缓存 -->
-    <cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>
-
-</#if>
-<#--<#if baseResultMap>-->
-    <#--<!-- 通用查询映射结果 &ndash;&gt;-->
-    <#--<resultMap id="BaseResultMap" type="${package.Entity}.${entity}">-->
-<#--<#list table.fields as field>-->
-<#--<#if field.keyFlag>&lt;#&ndash;生成主键排在第一位&ndash;&gt;-->
-        <#--<id column="${field.name}" property="${field.propertyName}" />-->
-<#--</#if>-->
-<#--</#list>-->
-<#--<#list table.commonFields as field>&lt;#&ndash;生成公共字段 &ndash;&gt;-->
-    <#--<result column="${field.name}" property="${field.propertyName}" />-->
-<#--</#list>-->
-<#--<#list table.fields as field>-->
-<#--<#if !field.keyFlag>&lt;#&ndash;生成普通字段 &ndash;&gt;-->
-        <#--<result column="${field.name}" property="${field.propertyName}" />-->
-<#--</#if>-->
-<#--</#list>-->
-    <#--</resultMap>-->
-
-<#--</#if>-->
-<#if baseColumnList>
-    <!-- 通用查询结果列 -->
-    <sql id="Base_Column_List">
-<#list table.commonFields as field>
-        ${field.name},
-</#list>
-        ${table.fieldNames}
-    </sql>
-
-</#if>
-</mapper>

+ 1 - 1
security-center/src/main/resources/freemarker/service.java.ftl

@@ -8,7 +8,7 @@ import ${superServiceClassPackage};
  * ${table.comment!} 服务类
  * </p>
  *
- * @author ${author}
+ <#--* @author ${author}-->
  <#--* @since ${date}-->
  */
 <#if kotlin>

+ 1 - 1
security-center/src/main/resources/freemarker/serviceImpl.java.ftl

@@ -11,7 +11,7 @@ import org.springframework.stereotype.Service;
  * ${table.comment!} 服务实现类
  * </p>
  *
- * @author ${author}
+ <#--* @author ${author}-->
  <#--* @since ${date}-->
  */
 @Service

+ 2 - 446
security-center/src/test/java/com/diagbot/CodeAutoGenerator.java

@@ -1,29 +1,5 @@
 package com.diagbot;
 
-import com.baomidou.mybatisplus.annotation.DbType;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import com.baomidou.mybatisplus.generator.AutoGenerator;
-import com.baomidou.mybatisplus.generator.InjectionConfig;
-import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
-import com.baomidou.mybatisplus.generator.config.FileOutConfig;
-import com.baomidou.mybatisplus.generator.config.GlobalConfig;
-import com.baomidou.mybatisplus.generator.config.IFileCreate;
-import com.baomidou.mybatisplus.generator.config.PackageConfig;
-import com.baomidou.mybatisplus.generator.config.StrategyConfig;
-import com.baomidou.mybatisplus.generator.config.TemplateConfig;
-import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
-import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
-import com.baomidou.mybatisplus.generator.config.po.TableInfo;
-import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
-import com.baomidou.mybatisplus.generator.config.rules.FileType;
-import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
-import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
-
-import java.awt.*;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
 /**
  * @ClassName: CodeAutoGenerator
  * @Description:
@@ -39,12 +15,7 @@ public class CodeAutoGenerator {
     private static String username = "root";
     private static String password = "lantone";
     private static String url = "jdbc:mysql://192.168.2.236:3306/qc?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
-    private static DbType DB_TYPE = DbType.MYSQL;
-    private static String driverClassName = "com.mysql.cj.jdbc.Driver";
-    /**
-     * 作者
-     */
-    private static String AUTHOR = "songxl";
+
     /**
      * 表名
      */
@@ -56,424 +27,9 @@ public class CodeAutoGenerator {
      */
     private static String[] ENTITY_IGNORE_PREFIX = { "med_" };
 
-
-    //生成文件根目录
-    private static String projectPath = "D://code";
-    //是否将根目录更新为工程的根目录【true会覆盖该项目对应目录下的文件、慎用】
-    private static boolean updatePath = true;
-    //模块名称
-    private static String moduleName = "security-center";
-
-    // 文件生成开关
-
-    //facade生成开关
-    private static boolean facadeFlag = true;
-    //service生成开关
-    private static boolean serviceFlag = true;
-    //serviceImpl生成开关
-    private static boolean serviceImplFlag = true;
-    //mapper.java
-    private static boolean mapperJFlag = true;
-    //mapperParent.java(数据业务数据库CRUD接口)生成开关
-    private static boolean mapperParentJFlag = true;
-    //mapper.xml (实体类bean与数据库表字段映射)生成开关
-    private static boolean mapperXFlag = true;
-    //mapperExt.xml(数据库CRUD sql)生成开关
-    private static boolean mapperExtXFlag = true;
-    //entity(表实体类)生成开关
-    private static boolean entityFlag = true;
-
-    /**
-     * 父包名路径(文件输出路径,也是导包的路径)
-     */
-    private static String PARENT_PACKAGE_PATH = "/com/lantone/security";
-    /**
-     * 生成文件父类包package
-     */
-    private static String packageName = "com.lantone.security";
-
-
-    // 各层包名
-    private static String ENTITY_PATH = "/entity/";
-    private static String FACADE_PATH = "/facade/";
-    private static String MAPPER_PATH = "/mapper/";
-    private static String XML_PATH = "/resources/mapper/";
-    private static String SERVICE_PATH = "/service/";
-    private static String SERVICE_IMPL_PATH = "/service/impl/";
-    private static String CONTROLLER_PATH = "/web/";
-
-
-    // 自定义输出模板和位置
-    /**
-     * entity输出模板
-     */
-    private static String ENTITY_TEMPLATE = "freemarker/entity.java.ftl";
-    private static String ENTITY_OUTPUT_PATH = "/src/main/java" + PARENT_PACKAGE_PATH + ENTITY_PATH;
-    /**
-     * facade输出模板
-     */
-    private static String FACADE_TEMPLATE = "freemarker/facade.java.ftl";
-    private static String FACADE_OUTPUT_PATH = "/src/main/java" + PARENT_PACKAGE_PATH + FACADE_PATH;
-    /**
-     * mapper.xml输出模板
-     */
-    private static String XML_TEMPLATE = "freemarker/mapper.xml.ftl";
-    private static String XML_OUTPUT_PATH = "/src/main" + XML_PATH;
-    /**
-     * mapperExt.xml输出模板
-     */
-    private static String XMLEXT_TEMPLATE = "freemarker/mapperExt.xml.ftl";
-    private static String XMLEXT_OUTPUT_PATH = "/src/main" + XML_PATH + "/ext/";
-    /**
-     * mapper.java输出模板
-     */
-    private static String MAPPER_TEMPLATE = "freemarker/mapper.java.ftl";
-    private static String MAPPER_OUTPUT_PATH = "/src/main/java" + PARENT_PACKAGE_PATH + MAPPER_PATH;
-
-    /**
-     * mapperParent.java输出模板
-     */
-    private static String BASEMAPPER_TEMPLATE = "freemarker/mapperParent.java.ftl";
-    private static String BASEMAPPER_OUTPUT_PATH = "/src/main/java" + PARENT_PACKAGE_PATH + MAPPER_PATH + "/parent/";
-
-    /**
-     * service输出模板
-     */
-    private static String SERVICE_TEMPLATE = "freemarker/service.java.ftl";
-    private static String SERVICE_OUTPUT_PATH = "/src/main/java" + PARENT_PACKAGE_PATH + SERVICE_PATH;
-    /**
-     * serviceImpl输出模板
-     */
-    private static String SERVICE_IMPL_TEMPLATE = "freemarker/serviceImpl.java.ftl";
-    private static String SERVICE_IMPL_OUTPUT_PATH = "/src/main/java" + PARENT_PACKAGE_PATH + SERVICE_IMPL_PATH;
-    /**
-     * controller输出模板
-     */
-    private static String CONTROLLER_TEMPLATE = "freemarker/controller.java.ftl";
-    private static String CONTROLLER_OUTPUT_PATH = "/src/main/java" + PARENT_PACKAGE_PATH + CONTROLLER_PATH;
-
-
     public static void main(String[] args) {
-
-        // 全局配置
-        GlobalConfig globalConfig = globalConfig();
-        // 数据源配置
-        DataSourceConfig dataSourceConfig = dataSourceConfig();
-        // 策略配置
-        StrategyConfig strategyConfig = strategyConfig();
-        // 包配置
-        PackageConfig packageConfig = packageConfig();
-        // 模板配置
-        TemplateConfig templateConfig = templateConfig();
-        // 自定义配置
-        InjectionConfig injectionConfig = injectionConfig();
-
-        // 执行
-        new AutoGenerator().setGlobalConfig(globalConfig)
-                .setDataSource(dataSourceConfig)
-                .setStrategy(strategyConfig)
-                .setPackageInfo(packageConfig)
-                // 因为使用了自定义模板,所以需要把各项置空否则会多生成一次
-                .setTemplate(templateConfig)
-                // 使用的模板引擎,如果不是默认模板引擎则需要添加模板依赖到pom
-                .setTemplateEngine(new FreemarkerTemplateEngine())
-                .setCfg(injectionConfig)
-                .execute();
+        GeneratorUtil.create(username, password, url, TABLES, ENTITY_IGNORE_PREFIX);
     }
 
-    /**
-     * 全局配置
-     */
-    private static GlobalConfig globalConfig() {
-        return new GlobalConfig()
-                // 打开文件
-                .setOpen(false)
-                //                .setOutputDir("D://code")
-                // 文件覆盖
-                .setFileOverride(true)
-                // 开启activeRecord模式
-                .setActiveRecord(false)
-                // XML 二级缓存
-                .setEnableCache(false)
-                // XML ResultMap: mapper.xml生成查询映射结果
-                .setBaseResultMap(true)
-                // XML ColumnList: mapper.xml生成查询结果列
-                .setBaseColumnList(false)
-                // swagger注解; 须添加swagger依赖
-                //                .setSwagger2(true)
-                // 作者
-                .setAuthor(AUTHOR)
-                // 设置实体类名称
-                .setControllerName("%sController")
-                .setServiceName("%sService")
-                .setServiceImplName("%sServiceImpl")
-                .setMapperName("%sMapper")
-                .setXmlName("%sMapper");
-    }
 
-    /**
-     * 数据源配置
-     */
-    private static DataSourceConfig dataSourceConfig() {
-        return new DataSourceConfig()
-                // 数据库类型
-                .setDbType(DB_TYPE)
-                // 连接驱动
-                .setDriverName(driverClassName)
-                // 地址
-                .setUrl(url)
-                // 用户名
-                .setUsername(username)
-                // 密码
-                .setPassword(password)
-                // 自定义数据库表字段类型转换【可选】
-                .setTypeConvert(new MySqlTypeConvert() {
-                    @Override
-                    public DbColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
-                        //将数据库中datetime转换成date
-                        if (fieldType.toLowerCase().contains("datetime")) {
-                            return DbColumnType.DATE;
-                        }
-                        return (DbColumnType) super.processTypeConvert(globalConfig, fieldType);
-                    }
-                });
-    }
-
-    /**
-     * 策略配置
-     */
-    private static StrategyConfig strategyConfig() {
-        return new StrategyConfig()
-                // 表名生成策略:下划线连转驼峰
-                .setNaming(NamingStrategy.underline_to_camel)
-                // 表字段生成策略:下划线连转驼峰
-                .setColumnNaming(NamingStrategy.underline_to_camel)
-                // 需要生成的表
-                .setInclude(TABLES)
-                // 生成controller
-                .setRestControllerStyle(true)
-                // 去除表前缀
-                .setTablePrefix(ENTITY_IGNORE_PREFIX)
-                // controller映射地址:驼峰转连字符
-                .setControllerMappingHyphenStyle(true)
-                // 是否启用builder 模式
-                .setEntityBuilderModel(true)
-                // 是否为lombok模型; 需要lombok依赖
-                .setEntityLombokModel(true)
-                // 生成实体类字段注解
-                .setEntityTableFieldAnnotationEnable(true)
-                //自定义父类
-                .setSuperServiceImplClass(null)
-                .setSuperMapperClass(null);
-    }
-
-    /**
-     * 包配置
-     * 设置包路径用于导包时使用,路径示例:com.path
-     */
-    private static PackageConfig packageConfig() {
-        return new PackageConfig()
-                // 父包名
-                .setParent(packageName)
-                .setEntity("entity")
-                .setMapper("mapper")
-                .setXml("resources.mapper")
-                .setService("service")
-                .setServiceImpl("service.impl")
-                .setController("facade");
-    }
-
-    /**
-     * 模板配置
-     */
-    private static TemplateConfig templateConfig() {
-        return new TemplateConfig()
-                // 置空后方便使用自定义输出位置
-                .setEntity(null)
-                .setXml(null)
-                .setMapper(null)
-                .setService(null)
-                .setServiceImpl(null)
-                .setController(null);
-    }
-
-    /**
-     * 自定义配置
-     */
-    private static InjectionConfig injectionConfig() {
-        return new InjectionConfig() {
-            @Override
-            public void initMap() {
-                // 注入配置
-            }
-        }
-                // 判断是否创建文件
-                .setFileCreate(new IFileCreate() {
-                    @Override
-                    public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
-
-                        // 检查文件目录,不存在自动递归创建
-                        checkDir(filePath);
-
-                        // 指定需要覆盖的文件
-                        // 文件结尾名字参照 全局配置 中对各层文件的命名,未修改为默认值
-                        if (isExists(filePath)) {
-                            if (filePath.endsWith("MapperParent.java")
-                                    || filePath.endsWith("Facade.java")) {
-                                return false;
-                            }
-                        }
-
-                        return true;
-                    }
-                })
-                // 自定义输出文件
-                .setFileOutConfigList(fileOutConfigList());
-    }
-
-    /**
-     * @Author songxl
-     * @Description 自定义输出文件配置
-     * @Date 2021/7/1
-     * @Param []
-     * @Return java.util.List<com.baomidou.mybatisplus.generator.config.FileOutConfig>
-     * @MethodName fileOutConfigList
-     */
-    private static List<FileOutConfig> fileOutConfigList() {
-
-        List<FileOutConfig> list = new ArrayList<>();
-        // 当前项目路径
-        if (updatePath) {
-            projectPath = System.getProperty("user.dir") + "\\" + moduleName;
-        }
-
-        // 实体类文件输出
-        if (entityFlag) {
-            list.add(new FileOutConfig(ENTITY_TEMPLATE) {
-                @Override
-                public String outputFile(TableInfo tableInfo) {
-                    makeDir(projectPath + ENTITY_OUTPUT_PATH);
-                    return projectPath + ENTITY_OUTPUT_PATH + tableInfo.getEntityName() + StringPool.DOT_JAVA;
-                }
-            });
-        }
-        // facade文件输出 不会覆盖
-        if (facadeFlag) {
-            list.add(new FileOutConfig(FACADE_TEMPLATE) {
-                @Override
-                public String outputFile(TableInfo tableInfo) {
-                    makeDir(projectPath + FACADE_OUTPUT_PATH);
-                    return projectPath + FACADE_OUTPUT_PATH + tableInfo.getServiceName().replaceAll("Service", "") + "Facade" + StringPool.DOT_JAVA;
-                }
-            });
-        }
-
-        // mapper xml文件输出
-        if (mapperXFlag) {
-            list.add(new FileOutConfig(XML_TEMPLATE) {
-                @Override
-                public String outputFile(TableInfo tableInfo) {
-                    makeDir(projectPath + XML_OUTPUT_PATH);
-                    return projectPath + XML_OUTPUT_PATH + tableInfo.getMapperName() + StringPool.DOT_XML;
-                }
-            });
-        }
-
-        //mapperExt xml文件输出
-        if (mapperExtXFlag) {
-            list.add(new FileOutConfig(XMLEXT_TEMPLATE) {
-                @Override
-                public String outputFile(TableInfo tableInfo) {
-                    makeDir(projectPath + XML_OUTPUT_PATH);
-                    return projectPath + XMLEXT_OUTPUT_PATH + tableInfo.getMapperName() + "Ext" + StringPool.DOT_XML;
-                }
-            });
-        }
-
-        // mapper文件输出
-        if (mapperJFlag) {
-            list.add(new FileOutConfig(MAPPER_TEMPLATE) {
-                @Override
-                public String outputFile(TableInfo tableInfo) {
-                    makeDir(projectPath + MAPPER_OUTPUT_PATH);
-                    return projectPath + MAPPER_OUTPUT_PATH + tableInfo.getMapperName() + StringPool.DOT_JAVA;
-                }
-            });
-        }
-        // mapperParent文件输出
-        if (mapperParentJFlag) {
-            list.add(new FileOutConfig(BASEMAPPER_TEMPLATE) {
-                @Override
-                public String outputFile(TableInfo tableInfo) {
-                    makeDir(projectPath + MAPPER_OUTPUT_PATH);
-                    return projectPath + BASEMAPPER_OUTPUT_PATH + tableInfo.getMapperName() + "Parent" + StringPool.DOT_JAVA;
-                }
-            });
-        }
-
-
-        // service文件输出
-        if (serviceFlag) {
-            list.add(new FileOutConfig(SERVICE_TEMPLATE) {
-                @Override
-                public String outputFile(TableInfo tableInfo) {
-                    makeDir(projectPath + SERVICE_OUTPUT_PATH);
-                    return projectPath + SERVICE_OUTPUT_PATH + tableInfo.getServiceName() + StringPool.DOT_JAVA;
-                }
-            });
-        }
-
-        // service impl文件输出
-        if (serviceImplFlag) {
-            list.add(new FileOutConfig(SERVICE_IMPL_TEMPLATE) {
-                @Override
-                public String outputFile(TableInfo tableInfo) {
-                    makeDir(projectPath + SERVICE_IMPL_OUTPUT_PATH);
-                    return projectPath + SERVICE_IMPL_OUTPUT_PATH + tableInfo.getServiceImplName() + StringPool.DOT_JAVA;
-                }
-            });
-        }
-
-        // controller文件输出
-        //        list.add(new FileOutConfig(CONTROLLER_TEMPLATE) {
-        //            @Override
-        //            public String outputFile(TableInfo tableInfo) {
-        //                makeDir(projectPath + CONTROLLER_OUTPUT_PATH);
-        //                return projectPath + CONTROLLER_OUTPUT_PATH + tableInfo.getControllerName() + StringPool.DOT_JAVA;
-        //            }
-        //        });
-
-        return list;
-    }
-
-    /**
-     * @Author songxl
-     * @Description 创建文件夹
-     * @Date 2021/7/1
-     * @Param [path]
-     * @Return void
-     * @MethodName makeDir
-     */
-    private static void makeDir(String path) {
-
-        File dir = new File(path);
-        if (!dir.exists()) {
-            dir.mkdirs();
-        }
-    }
-
-    /**
-     * @Author songxl
-     * @Description 判断文件是否存在
-     * @Date 2021/7/1
-     * @Param [path]
-     * @Return boolean
-     * @MethodName isExists
-     */
-    private static boolean isExists(String path) {
-
-
-        File file = new File(path);
-        return file.exists();
-    }
 }

+ 468 - 0
security-center/src/test/java/com/diagbot/GeneratorUtil.java

@@ -0,0 +1,468 @@
+package com.diagbot;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.InjectionConfig;
+import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.FileOutConfig;
+import com.baomidou.mybatisplus.generator.config.GlobalConfig;
+import com.baomidou.mybatisplus.generator.config.IFileCreate;
+import com.baomidou.mybatisplus.generator.config.PackageConfig;
+import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.TemplateConfig;
+import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
+import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
+import com.baomidou.mybatisplus.generator.config.rules.FileType;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @ClassName: GeneratorUtil
+ * @Description:
+ * @Author songxl
+ * @Date 2021/7/5
+ * @Version 1.0
+ */
+public class GeneratorUtil {
+    /**
+     * 作者
+     */
+    private static String AUTHOR = "songxl";
+    private static DbType DB_TYPE = DbType.MYSQL;
+    private static String driverClassName = "com.mysql.cj.jdbc.Driver";
+
+    //生成文件根目录
+    private static String projectPath = "D://code";
+    //是否将根目录更新为工程的根目录【true会覆盖该项目对应目录下的文件、慎用】
+    private static boolean updatePath = true;
+    //模块名称
+    private static String moduleName = "security-center";
+
+    // 文件生成开关
+
+    //facade生成开关
+    private static boolean facadeFlag = true;
+    //service生成开关
+    private static boolean serviceFlag = true;
+    //serviceImpl生成开关
+    private static boolean serviceImplFlag = true;
+    //mapper.java
+    private static boolean mapperJFlag = true;
+    //mapperParent.java(数据业务数据库CRUD接口)生成开关
+    private static boolean mapperParentJFlag = false;
+    //mapper.xml (实体类bean与数据库表字段映射)生成开关
+    private static boolean baseMapperXFlag = true;
+    //mapper.xml(数据库CRUD sql)生成开关
+    private static boolean mapperXFlag = true;
+    //entity(表实体类)生成开关
+    private static boolean entityFlag = true;
+
+    /**
+     * 父包名路径(文件输出路径,也是导包的路径)
+     */
+    private static String PARENT_PACKAGE_PATH = "/com/lantone/security";
+    /**
+     * 生成文件父类包package
+     */
+    private static String packageName = "com.lantone.security";
+
+
+    // 各层包名
+    private static String ENTITY_PATH = "/entity/";
+    private static String FACADE_PATH = "/facade/";
+    private static String MAPPER_PATH = "/mapper/";
+    private static String XML_PATH = "/resources/mapper/";
+    private static String SERVICE_PATH = "/service/";
+    private static String SERVICE_IMPL_PATH = "/service/impl/";
+    private static String CONTROLLER_PATH = "/web/";
+
+
+    // 自定义输出模板和位置
+    /**
+     * entity输出模板
+     */
+    private static String ENTITY_TEMPLATE = "freemarker/entity.java.ftl";
+    private static String ENTITY_OUTPUT_PATH = "/src/main/java" + PARENT_PACKAGE_PATH + ENTITY_PATH;
+    /**
+     * facade输出模板
+     */
+    private static String FACADE_TEMPLATE = "freemarker/facade.java.ftl";
+    private static String FACADE_OUTPUT_PATH = "/src/main/java" + PARENT_PACKAGE_PATH + FACADE_PATH;
+    /**
+     * mapper.xml输出模板
+     */
+    private static String XML_TEMPLATE = "freemarker/baseMapper.xml.ftl";
+    private static String XML_OUTPUT_PATH = "/src/main" + XML_PATH + "/base/";
+    /**
+     * mapperExt.xml输出模板
+     */
+    private static String XMLEXT_TEMPLATE = "freemarker/mapper.xml.ftl";
+    private static String XMLEXT_OUTPUT_PATH = "/src/main" + XML_PATH;
+    /**
+     * mapper.java输出模板
+     */
+    private static String MAPPER_TEMPLATE = "freemarker/mapper.java.ftl";
+    private static String MAPPER_OUTPUT_PATH = "/src/main/java" + PARENT_PACKAGE_PATH + MAPPER_PATH;
+
+    /**
+     * mapperParent.java输出模板
+     */
+    private static String BASEMAPPER_TEMPLATE = "freemarker/mapperParent.java.ftl";
+    private static String BASEMAPPER_OUTPUT_PATH = "/src/main/java" + PARENT_PACKAGE_PATH + MAPPER_PATH + "/parent/";
+
+    /**
+     * service输出模板
+     */
+    private static String SERVICE_TEMPLATE = "freemarker/service.java.ftl";
+    private static String SERVICE_OUTPUT_PATH = "/src/main/java" + PARENT_PACKAGE_PATH + SERVICE_PATH;
+    /**
+     * serviceImpl输出模板
+     */
+    private static String SERVICE_IMPL_TEMPLATE = "freemarker/serviceImpl.java.ftl";
+    private static String SERVICE_IMPL_OUTPUT_PATH = "/src/main/java" + PARENT_PACKAGE_PATH + SERVICE_IMPL_PATH;
+    /**
+     * controller输出模板
+     */
+    private static String CONTROLLER_TEMPLATE = "freemarker/controller.java.ftl";
+    private static String CONTROLLER_OUTPUT_PATH = "/src/main/java" + PARENT_PACKAGE_PATH + CONTROLLER_PATH;
+
+
+    /**
+     * 全局配置
+     */
+    private static GlobalConfig globalConfig() {
+        return new GlobalConfig()
+                // 打开文件
+                .setOpen(false)
+                //                .setOutputDir("D://code")
+                // 文件覆盖
+                .setFileOverride(true)
+                // 开启activeRecord模式
+                .setActiveRecord(false)
+                // XML 二级缓存
+                .setEnableCache(false)
+                // XML ResultMap: mapper.xml生成查询映射结果
+                .setBaseResultMap(true)
+                // XML ColumnList: mapper.xml生成查询结果列
+                .setBaseColumnList(false)
+                // swagger注解; 须添加swagger依赖
+                //                .setSwagger2(true)
+                // 作者
+                //                .setAuthor(AUTHOR)
+                // 设置实体类名称
+                .setControllerName("%sController")
+                .setServiceName("%sService")
+                .setServiceImplName("%sServiceImpl")
+                .setMapperName("%sMapper")
+                .setXmlName("%sMapper");
+    }
+
+    /**
+     * 数据源配置
+     */
+    private static DataSourceConfig dataSourceConfig(String url, String username, String password) {
+        return new DataSourceConfig()
+                // 数据库类型
+                .setDbType(DB_TYPE)
+                // 连接驱动
+                .setDriverName(driverClassName)
+                // 地址
+                .setUrl(url)
+                // 用户名
+                .setUsername(username)
+                // 密码
+                .setPassword(password)
+                // 自定义数据库表字段类型转换【可选】
+                .setTypeConvert(new MySqlTypeConvert() {
+                    @Override
+                    public DbColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
+                        //将数据库中datetime转换成date
+                        if (fieldType.toLowerCase().contains("datetime")) {
+                            return DbColumnType.DATE;
+                        }
+                        return (DbColumnType) super.processTypeConvert(globalConfig, fieldType);
+                    }
+                });
+    }
+
+    /**
+     * 策略配置
+     */
+    private static StrategyConfig strategyConfig(String[] TABLES, String[] ENTITY_IGNORE_PREFIX) {
+        return new StrategyConfig()
+                // 表名生成策略:下划线连转驼峰
+                .setNaming(NamingStrategy.underline_to_camel)
+                // 表字段生成策略:下划线连转驼峰
+                .setColumnNaming(NamingStrategy.underline_to_camel)
+                // 需要生成的表
+                .setInclude(TABLES)
+                // 生成controller
+                .setRestControllerStyle(true)
+                // 去除表前缀
+                .setTablePrefix(ENTITY_IGNORE_PREFIX)
+                // controller映射地址:驼峰转连字符
+                .setControllerMappingHyphenStyle(true)
+                // 是否启用builder 模式
+                .setEntityBuilderModel(true)
+                // 是否为lombok模型; 需要lombok依赖
+                .setEntityLombokModel(true)
+                // 生成实体类字段注解
+                .setEntityTableFieldAnnotationEnable(true)
+                //自定义父类
+                .setSuperServiceImplClass(null)
+                .setSuperMapperClass(null);
+    }
+
+    /**
+     * 包配置
+     * 设置包路径用于导包时使用,路径示例:com.path
+     */
+    private static PackageConfig packageConfig() {
+        return new PackageConfig()
+                // 父包名
+                .setParent(packageName)
+                .setEntity("entity")
+                .setMapper("mapper")
+                .setXml("resources.mapper")
+                .setService("service")
+                .setServiceImpl("service.impl")
+                .setController("facade");
+    }
+
+    /**
+     * 模板配置
+     */
+    private static TemplateConfig templateConfig() {
+        return new TemplateConfig()
+                // 置空后方便使用自定义输出位置
+                .setEntity(null)
+                .setXml(null)
+                .setMapper(null)
+                .setService(null)
+                .setServiceImpl(null)
+                .setController(null);
+    }
+
+    /**
+     * 自定义配置
+     */
+    private static InjectionConfig injectionConfig() {
+        return new InjectionConfig() {
+            @Override
+            public void initMap() {
+                // 注入配置
+            }
+        }
+                // 判断是否创建文件
+                .setFileCreate(new IFileCreate() {
+                    @Override
+                    public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
+
+                        // 检查文件目录,不存在自动递归创建
+                        checkDir(filePath);
+
+                        // 指定需要覆盖的文件
+                        // entity或mapper.xml覆盖
+                        if (isExists(filePath)) {
+                            if (filePath.contains("/entity")
+                                    || filePath.endsWith(".xml") && filePath.contains("/base")) {
+                                return true;
+                            }
+                            return false;
+                        }
+
+                        return true;
+                    }
+                })
+                // 自定义输出文件
+                .setFileOutConfigList(fileOutConfigList());
+    }
+
+    /**
+     * @Author songxl
+     * @Description 自定义输出文件配置
+     * @Date 2021/7/1
+     * @Param []
+     * @Return java.util.List<com.baomidou.mybatisplus.generator.config.FileOutConfig>
+     * @MethodName fileOutConfigList
+     */
+    private static List<FileOutConfig> fileOutConfigList() {
+
+        List<FileOutConfig> list = new ArrayList<>();
+        // 当前项目路径
+        if (updatePath) {
+            projectPath = System.getProperty("user.dir") + "\\" + moduleName;
+        }
+
+        // 实体类文件输出
+        if (entityFlag) {
+            list.add(new FileOutConfig(ENTITY_TEMPLATE) {
+                @Override
+                public String outputFile(TableInfo tableInfo) {
+                    makeDir(projectPath + ENTITY_OUTPUT_PATH);
+                    return projectPath + ENTITY_OUTPUT_PATH + tableInfo.getEntityName() + StringPool.DOT_JAVA;
+                }
+            });
+        }
+        // facade文件输出 不会覆盖
+        if (facadeFlag) {
+            list.add(new FileOutConfig(FACADE_TEMPLATE) {
+                @Override
+                public String outputFile(TableInfo tableInfo) {
+                    makeDir(projectPath + FACADE_OUTPUT_PATH);
+                    return projectPath + FACADE_OUTPUT_PATH + tableInfo.getServiceName().replaceAll("Service", "") + "Facade" + StringPool.DOT_JAVA;
+                }
+            });
+        }
+
+        // mapper xml文件输出
+        if (baseMapperXFlag) {
+            list.add(new FileOutConfig(XML_TEMPLATE) {
+                @Override
+                public String outputFile(TableInfo tableInfo) {
+                    makeDir(projectPath + XML_OUTPUT_PATH);
+                    return projectPath + XML_OUTPUT_PATH + "Base" + tableInfo.getMapperName() + StringPool.DOT_XML;
+                }
+            });
+        }
+
+        //mapperExt xml文件输出
+        if (mapperXFlag) {
+            list.add(new FileOutConfig(XMLEXT_TEMPLATE) {
+                @Override
+                public String outputFile(TableInfo tableInfo) {
+                    makeDir(projectPath + XML_OUTPUT_PATH);
+                    return projectPath + XMLEXT_OUTPUT_PATH + tableInfo.getMapperName() + StringPool.DOT_XML;
+                }
+            });
+        }
+
+        // mapper文件输出
+        if (mapperJFlag) {
+            list.add(new FileOutConfig(MAPPER_TEMPLATE) {
+                @Override
+                public String outputFile(TableInfo tableInfo) {
+                    makeDir(projectPath + MAPPER_OUTPUT_PATH);
+                    return projectPath + MAPPER_OUTPUT_PATH + tableInfo.getMapperName() + StringPool.DOT_JAVA;
+                }
+            });
+        }
+        // mapperParent文件输出
+        if (mapperParentJFlag) {
+            list.add(new FileOutConfig(BASEMAPPER_TEMPLATE) {
+                @Override
+                public String outputFile(TableInfo tableInfo) {
+                    makeDir(projectPath + MAPPER_OUTPUT_PATH);
+                    return projectPath + BASEMAPPER_OUTPUT_PATH + tableInfo.getMapperName() + "Parent" + StringPool.DOT_JAVA;
+                }
+            });
+        }
+
+
+        // service文件输出
+        if (serviceFlag) {
+            list.add(new FileOutConfig(SERVICE_TEMPLATE) {
+                @Override
+                public String outputFile(TableInfo tableInfo) {
+                    makeDir(projectPath + SERVICE_OUTPUT_PATH);
+                    return projectPath + SERVICE_OUTPUT_PATH + tableInfo.getServiceName() + StringPool.DOT_JAVA;
+                }
+            });
+        }
+
+        // service impl文件输出
+        if (serviceImplFlag) {
+            list.add(new FileOutConfig(SERVICE_IMPL_TEMPLATE) {
+                @Override
+                public String outputFile(TableInfo tableInfo) {
+                    makeDir(projectPath + SERVICE_IMPL_OUTPUT_PATH);
+                    return projectPath + SERVICE_IMPL_OUTPUT_PATH + tableInfo.getServiceImplName() + StringPool.DOT_JAVA;
+                }
+            });
+        }
+
+        // controller文件输出
+        //        list.add(new FileOutConfig(CONTROLLER_TEMPLATE) {
+        //            @Override
+        //            public String outputFile(TableInfo tableInfo) {
+        //                makeDir(projectPath + CONTROLLER_OUTPUT_PATH);
+        //                return projectPath + CONTROLLER_OUTPUT_PATH + tableInfo.getControllerName() + StringPool.DOT_JAVA;
+        //            }
+        //        });
+
+        return list;
+    }
+
+    /**
+     * @Author songxl
+     * @Description 创建文件夹
+     * @Date 2021/7/1
+     * @Param [path]
+     * @Return void
+     * @MethodName makeDir
+     */
+    private static void makeDir(String path) {
+
+        File dir = new File(path);
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+    }
+
+    /**
+     * @Author songxl
+     * @Description 判断文件是否存在
+     * @Date 2021/7/1
+     * @Param [path]
+     * @Return boolean
+     * @MethodName isExists
+     */
+    private static boolean isExists(String path) {
+
+
+        File file = new File(path);
+        return file.exists();
+    }
+
+    /**
+     * @Author songxl
+     * @Description 自动生成类方法
+     * @Date 2021/7/5
+     * @Param [username, password, url, tables, entityIgnorePrefix]
+     * @Return void
+     * @MethodName create
+     */
+    public static void create(String username, String password, String url, String[] tables, String[] entityIgnorePrefix) {
+        // 全局配置
+        GlobalConfig globalConfig = globalConfig();
+        // 数据源配置
+        DataSourceConfig dataSourceConfig = dataSourceConfig(url, username, password);
+        // 策略配置
+        StrategyConfig strategyConfig = strategyConfig(tables, entityIgnorePrefix);
+        // 包配置
+        PackageConfig packageConfig = packageConfig();
+        // 模板配置
+        TemplateConfig templateConfig = templateConfig();
+        // 自定义配置
+        InjectionConfig injectionConfig = injectionConfig();
+
+        // 执行
+        new AutoGenerator().setGlobalConfig(globalConfig)
+                .setDataSource(dataSourceConfig)
+                .setStrategy(strategyConfig)
+                .setPackageInfo(packageConfig)
+                // 因为使用了自定义模板,所以需要把各项置空否则会多生成一次
+                .setTemplate(templateConfig)
+                // 使用的模板引擎,如果不是默认模板引擎则需要添加模板依赖到pom
+                .setTemplateEngine(new FreemarkerTemplateEngine())
+                .setCfg(injectionConfig)
+                .execute();
+    }
+}