MyBatisPlusGenerator

目录

依赖包

JAVA代码 

ftl文件

controller.ftl

service.ftl

serviceImpl.ftl

mapper.ftl

mapper.xml.ftl

extmapper.xml.ftl

entity.ftl


依赖包

<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-generator</artifactId>
	<version>3.4.1</version>
</dependency>
<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-lang3</artifactId>
	<version>3.9</version>
</dependency>
<dependency>
	<groupId>org.postgresql</groupId>
	<artifactId>postgresql</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<build>
	<resources>
		<resource>
			<directory>src/main/resources</directory>
			<filtering>true</filtering>
		</resource>
	</resources>
</build>

JAVA代码 

package com.example.demo;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
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.*;
import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.FileType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.lang.reflect.Field;
import java.util.*;

public class BatisplusGenerators {
    private static final Logger log = LoggerFactory.getLogger(BatisplusGenerators.class);
    static String SCHEMA_NAME ="warning_event";
    static String MANAGER = "manager";
    static String MANAGER_IMPL = "managerImpl";

    public BatisplusGenerators() {
    }

    //ms_template,ms_message,ms_message_push,ms_scene,ms_scene_config,ms_user_mqtt_bind
    public static void main(String[] args) throws Exception {
        AutoGenerator autoGenerator = new AutoGenerator();
        //全局配置
        com.baomidou.mybatisplus.generator.config.GlobalConfig globalConfig = new com.baomidou.mybatisplus.generator.config.GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        System.out.println("PROJECT PATH: " + projectPath);
        globalConfig.setAuthor("chendaqing");
        globalConfig.setEnableCache(false);
        globalConfig.setBaseResultMap(true);
        globalConfig.setBaseColumnList(true);
        //globalConfig.setSwagger2(true);
        globalConfig.setOpen(false);
        globalConfig.setFileOverride(true);
        autoGenerator.setGlobalConfig(globalConfig);

        //包路径
        String parentName = "com.gennlife.cdc.earlywarning";
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent(parentName);

        String moduleName = scanner();
        String modulePackage = "0".equalsIgnoreCase(moduleName) ? "" : "."+moduleName;
        String modulePath = "0".equalsIgnoreCase(moduleName) ? "" : "/"+moduleName;

        Map<String, String> packageInfo = new HashMap<>();
        packageInfo.put(ConstVal.CONTROLLER, parentName+ ".controller"+modulePackage);
        packageInfo.put(ConstVal.SERVICE, parentName+".service"+modulePackage);
        packageInfo.put(ConstVal.SERVICE_IMPL, parentName+".service.impl"+modulePackage);
        packageInfo.put(ConstVal.ENTITY, parentName+".dao.entity"+modulePackage);
        packageInfo.put(ConstVal.MAPPER, parentName+".dao.mapper"+modulePackage);
        packageInfo.put(MANAGER, parentName+".dao.manager"+modulePackage);
        packageInfo.put(MANAGER_IMPL, parentName+".dao.manager.impl"+modulePackage);

        //设置不同类文件生成的路径
        Map pathInfo = new HashMap<>();
        String srcPath = projectPath + "/earlywarning-server/src/main/java/";
        String daoPath = projectPath + "/earlywarning-dao/src/main/";

        pathInfo.put(ConstVal.CONTROLLER_PATH, srcPath + packageInfo.get(ConstVal.CONTROLLER).replaceAll("\\.", "\\/"));
        pathInfo.put(ConstVal.SERVICE_PATH, srcPath + packageInfo.get(ConstVal.SERVICE).replaceAll("\\.", "\\/"));
        pathInfo.put(ConstVal.SERVICE_IMPL_PATH, srcPath + packageInfo.get(ConstVal.SERVICE_IMPL).replaceAll("\\.", "\\/"));
        pathInfo.put(ConstVal.ENTITY_PATH, daoPath + "java/" + packageInfo.get(ConstVal.ENTITY).replaceAll("\\.", "\\/"));
        pathInfo.put(ConstVal.MAPPER_PATH, daoPath + "java/" + packageInfo.get(ConstVal.MAPPER).replaceAll("\\.", "\\/"));
        pathInfo.put(ConstVal.XML_PATH, daoPath +"resources/mapper" + modulePath);
        packageConfig.setPathInfo(pathInfo);

        autoGenerator.setPackageInfo(packageConfig);

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                Map<String,Object> map = new HashMap<>();
                map.put("schemaName",SCHEMA_NAME);
                this.setMap(map);
            }
        };

        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig("ftl/manager.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名
                return daoPath +"/java/"+ packageInfo.get(MANAGER).replaceAll("\\.", "\\/")
                        + "/I" + tableInfo.getEntityName() + "Manager" + StringPool.DOT_JAVA;
            }
        });
        focList.add(new FileOutConfig("ftl/managerImpl.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名
                return daoPath +"/java/"+ packageInfo.get(MANAGER_IMPL).replaceAll("\\.", "\\/")
                        + "/" + tableInfo.getEntityName() + "ManagerImpl" + StringPool.DOT_JAVA;
            }
        });
        focList.add(new FileOutConfig("ftl/extmapper.xml.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                String extXmlPath = daoPath + "/resources/mapper/ext/";
                File file = new File(extXmlPath);
                if(!file.exists()){
                    file.mkdirs();
                }
                // 自定义输出文件名
                return extXmlPath + tableInfo.getEntityName() + "ExtMapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        autoGenerator.setCfg(cfg);

        //设置如果存在service以及controller和mapper.java 则不再重新生成,不然写的代码都会被覆盖
        cfg.setFileCreate(new IFileCreate() {
            @Override
            public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
                // 判断自定义文件夹是否需要创建

                //判断是否是service或者mapperext或者是Repository,如果是则判断是否已经存在,如果已经存在则不生成
                if(
                        filePath.lastIndexOf("ServiceImpl.java") != -1 ||
                                filePath.lastIndexOf("Service.java") != -1 ||
                                filePath.lastIndexOf("Controller.java") != -1 ||
                                filePath.lastIndexOf("Mapper.java") != -1 ||
                                filePath.lastIndexOf("Manager.java") != -1 ||
                                (filePath.lastIndexOf("Mapper.xml") != -1  &&
                                        filePath.lastIndexOf("ExtMapper.xml") == -1) ||
                                filePath.lastIndexOf("ManagerImpl.java") != -1
                ){
                    File file = new File(filePath);
                    if(file.exists()){
                        System.out.println(file.getName()+"  已存在,忽略再次生成");
                        return false;
                    }
                }


                checkDir(filePath);
                System.out.println("创建:"+filePath);
                return true;

            }
        });

        //数据源
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDbType(DbType.POSTGRE_SQL);
        dataSourceConfig.setSchemaName(SCHEMA_NAME);
        dataSourceConfig.setUrl("jdbc:postgresql://10.0.0.221:5432/gdcdc_test_1221");
        dataSourceConfig.setDriverName("org.postgresql.Driver");
        dataSourceConfig.setUsername("gdcdc_test");
        dataSourceConfig.setPassword("gDb27!03&~");
        autoGenerator.setDataSource(dataSourceConfig);

        //设置模板文件
        TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.setEntity("ftl/entity");
        templateConfig.setMapper("ftl/mapper");
        templateConfig.setXml("ftl/mapper.xml");
        templateConfig.setService("ftl/service");
        templateConfig.setServiceImpl("ftl/serviceImpl");
        templateConfig.setController("ftl/controller");
        autoGenerator.setTemplate(templateConfig);
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);

        //指定公共实体类以及公共字段
        strategy.setSuperEntityClass("com.gennlife.cdc.earlywarning.framework.base.BaseEntity");
        strategy.setSuperMapperClass("com.gennlife.cdc.earlywarning.framework.base.BaseMapper");
        strategy.setSuperEntityColumns(new String[] { "id","del_flag","create_time","update_time"});

        strategy.setRestControllerStyle(true);
        strategy.setInclude(getTable("表名"));
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix(new String[]{"ew_"});
        autoGenerator.setStrategy(strategy);
        autoGenerator.setTemplateEngine(new FreemarkerTemplateEngine());

        ConfigBuilder configBuilder = new ConfigBuilder(autoGenerator.getPackageInfo(), autoGenerator.getDataSource(), autoGenerator.getStrategy(), autoGenerator.getTemplate(), autoGenerator.getGlobalConfig());
        Field packageInfoField = configBuilder.getClass().getDeclaredField("packageInfo");
        packageInfoField.setAccessible(true);
        packageInfoField.set(configBuilder,packageInfo);
        /**
         * 设置配置对象
         */
        autoGenerator.setConfig(configBuilder);

        autoGenerator.execute();
    }

    public static String scanner() {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("默认包名为com.gennlife.cdc.earlywarning, 请输入下级包名,没有请输入0");
        log.info(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotEmpty(ipt)) {
                return ipt;
            }
        }

        throw new MybatisPlusException("请输入正确的包名");
    }

    public static String[] getTable(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + ":");
        log.info(help.toString());
        if (scanner.hasNext()) {
            String[] result = scanner.next().split(",");
            if (ObjectUtils.isNotEmpty(result)) {
                return result;
            }
        }
        return null;
    }
}

ftl文件

controller.ftl

package ${package.Controller};

import com.gennlife.base.model.PaginationResponse;
import com.gennlife.base.model.Result;
import ${package.Entity}.${entity};
import ${package.Service}.${table.serviceName};
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
* <p>
* ${table.comment!} 前端控制器
* </p>
*
* @author ${author}
* @since ${date}
*/
@RestController
@RequestMapping("<#if package.ModuleName??>/${package.ModuleName}</#if>/<#if controllerMappingHyphenStyle??>${controllerMappingHyphen}<#else>${table.entityPath}</#if>")
public class ${table.controllerName} {
    @Autowired
    ${table.serviceName} ${entity?uncap_first}Service;

}

service.ftl

package ${package.Service};

import ${package.Entity}.${entity};
import com.gennlife.cdc.earlywarning.framework.base.BaseService;

/**
* <p>
* ${table.comment!} 服务类
* </p>
*
* @author ${author}
* @since ${date}
*/
public interface ${table.serviceName} extends BaseService<${entity}>{


}

serviceImpl.ftl

package ${package.ServiceImpl};

import ${package.Entity}.${entity};
import ${package.Service}.${table.serviceName};
import ${package.manager}.I${entity}Manager;
import com.gennlife.cdc.earlywarning.framework.base.BaseServiceImpl;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
* <p>
* ${table.comment!} 服务实现类
* </p>
*
* @author ${author}
* @since ${date}
*/
@Service
public class ${table.serviceImplName} extends BaseServiceImpl<${entity}> implements ${table.serviceName} {

    @Autowired
    I${entity}Manager ${entity?uncap_first}Manager;

}

mapper.ftl

package ${package.Mapper};

import ${package.Entity}.${entity};
import ${superMapperClassPackage};


import java.util.List;

/**
* <p>
* ${table.comment!} Mapper 接口
* </p>
*
* @author ${author}
* @since ${date}
*/
public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {

}

mapper.xml.ftl

<?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>
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        <include refid="${package.Mapper}.ext.${table.mapperName}.Ext_Mapper_Base_Column_List"/>
    </sql>

</mapper>

extmapper.xml.ftl

<?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}.ext.${table.mapperName}">

<#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="Ext_Mapper_Base_Column_List">
<#list table.commonFields as field>
        ${field.name},
</#list>
        ${table.fieldNames}
    </sql>

</#if>

</mapper>

entity.ftl

package ${package.Entity};

import com.baomidou.mybatisplus.annotation.TableName;
<#list table.importPackages as pkg>
import ${pkg};
</#list>
<#if entityLombokModel>
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
</#if>
<#if swagger2>
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
</#if>


/**
* <p>
* ${table.comment!}
* </p>
*
* @author ${author}
* @since ${date}
*/
<#if entityLombokModel>
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
</#if>
@TableName(value = "${table.name}", schema = "${cfg.schemaName}" )
<#if swagger2>
@ApiModel(value="${entity}对象", description="${table.comment!}")
</#if>
<#if superEntityClass??>
public class ${entity} extends ${superEntityClass}<${entity}>{
<#else>
public class ${entity} {
</#if>

<#-- ----------  BEGIN 字段循环遍历  ---------->
<#list table.fields as field>
    <#if swagger2>
    @ApiModelProperty(value = "${field.comment}")
    <#else>
    /**
    * ${field.comment}
    */
    </#if>
    private ${field.propertyType} ${field.propertyName};

</#list>
<#------------  END 字段循环遍历  ---------->

}